Форум программистов, компьютерный форум, киберфорум
wareZ1400
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

new, delete, динамический массив, указатель, удаление массива

Запись от wareZ1400 размещена 05.04.2017 в 03:12
Обновил(-а) wareZ1400 07.04.2017 в 14:29

// создание и удаление динамического массива, изменение позиции указателя, доступ к элементам массива
// размер элемента массива
// использование пары new тип[]; и delete [] массив;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main()
{   // указатель на начало сделанного массива называется также, как имя массива
    double* dyn_arr = new double[3]; // сделать динамический массив, указатель устанавливается в начало массива
    dyn_arr[0] = 0.2; // инициализация элементов массива
    dyn_arr[1] = 0.5;
    dyn_arr[2] = 0.8;
 
    cout << "size of array's element = " << sizeof(*dyn_arr) << endl; // размер элемента массива
    cout << "pointer's address = " << dyn_arr << endl << endl; // вывод адреса начала массива
    cout << "dyn_arr[1] = " << dyn_arr[1] << endl; // вывод первого элемента массива
    
    dyn_arr++; // увеличение значения указателя на 1 позицию
    cout << "pointer dyn_arr was just incremented\n";
    cout << "pointer's address = " << dyn_arr << endl;
    cout << "dyn_arr[0] = " << dyn_arr[0] << endl; // вывод нулевого элемента массива
    cout << "dyn_arr[1] = " << dyn_arr[1] << endl; // вывод первого элемента массива
    
    dyn_arr--; // уменьшение значения указателя на 1 позицию
    cout << "pointer dyn_arr was just decremented\n";
    cout << "pointer's address = " << dyn_arr << endl;
    cout << "dyn_arr[0] = " << dyn_arr[0] << endl;
    cout << "dyn_arr[1] = " << dyn_arr[1] << endl;
    cout << "dyn_arr[2] = " << dyn_arr[2] << endl;
 
    delete [] dyn_arr; // удаление динамического массива. Скобочки [] нужны, так  как это был массив и при его создании словом new тоже были скобки[]
    cout << "array was just deleted" << endl;
    cout << "dyn_arr[0] = " << dyn_arr[0] << endl;
    cout << "dyn_arr[1] = " << dyn_arr[1] << endl;
    cout << "dyn_arr[2] = " << dyn_arr[2] << endl;
 
    system("pause");
    return 0;
}


вывод адреса массива, char-указателя, int-указателя
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char ch_arr[100] = "the first value of ch_arr";
const char* const_ch_ptr = "const pointer's address"; // адрес строки помещается в указатель-на-чар, который константа, то есть не может быть изменён
char* ch_ptr = ch_arr;
int i = 1000;
int* int_ptr = &i; // поставить инт-указатель по адресу переменной типа инт
 
cout << &ch_arr << " : " << ch_arr << endl; // адрес массива чаров и содержимое, то есть строка, которой он инициализирован
cout << (int*)const_ch_ptr << " : " << const_ch_ptr << endl; // вывод адреса и строки по адресу константного указателя. Обычный указатель на чар студия не даёт приравнивать к константному указателю на чар
cout << (int*)ch_ptr << " : " << ch_ptr << endl; // вывод адреса и строки, расположенной по нему.
                                                     // при передачe в вывод чар-указателя выводится строка указываемая, поэтому для вывода адреса, на который указывает указатель,
                                                     // надо привести чар-укатель к типу инт-указателя
cout << endl;
cout << &i << " : " << i << endl; // адрес инта и инт
cout << int_ptr << " : " << *int_ptr << endl; // адрес (указатель) и значение, на которое он указывает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
char ch_arr0[10] = "ABCD";
char ch_arr1[10] = "ABVG"; // память под этот массив может быть распределена где-то в неопределенном месте, не обязательно после или перед памятью под массив ch_arr0 
char* ch_ptr = ch_arr0;
 
cout << &ch_arr0 << " : " << ch_arr0 << endl; // адрес массива чаров (то есть адреса нулевого элемента массива чаров) и содержимое, то есть строка, которой он инициализирован
cout << (int*)ch_ptr << " : " << ch_ptr << endl; // вывод адреса и строки, расположенной по нему.
                                                     // при передачe в вывод чар-указателя выводится строка указываемая, поэтому для вывода адреса, на который указывает указатель,
                                                     // надо привести чар-укатель к типу инт-указателя   
cout << &ch_arr1 << " : " << ch_arr1 << endl;
cout << "sizeof : " << sizeof(ch_arr0) << endl; // сколько под массив выделено байтов
cout << "return from strlen(CHAR_ARRAY) : " << strlen(ch_arr0) << endl; // длинна строки записанной в массив чаров, нулевой-символ, указывающий на конец строки не считается
for (int i = 0 ; i < 10; i++) // вывод чар массива
    cout << i << " : " << ch_arr0[i] << endl;
Размещено в Без категории
Показов 1746 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    если писать с начала строки подряд символы из другой строки, которая больше (той, в которую пишутся символы), то можно сломать программу.
    Чтобы её не ломать надо контролировать количество записываемых символов.
    Чтобы не выводить каркозябру cout надо останавливать. Он останавливается, когда доходит до нулевого символа '\0' .
    Чтобы не выходить за пределы строки при копировании в неё из более длинной строки можно использовать strncpy() .
    Чтобы cout при выводе, начиная с начала строки, не выводила кракозябру можно ограничить конец строки нулевым символом.

    То есть делать так:

    strncpy(КУДА, ОТКУДА, СКОЛЬКО_СИМВОЛОВ КОПИРОВАТЬ);
    КУДА[ПОСЛЕДНИЙ] = '\0';


    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    #include "stdafx.h"
    #include <iostream>
    #include <cstring> // для strlen(), strcpy(), strncpy()
    using namespace std;
     
    int main()
    {
        char ch_arr0[10] = "ABCDEFGHI";
        char ch_arr1[20] = "ODTCPSSVDDODTCPSSVD";
     
        cout << &ch_arr0 << " : " << ch_arr0 << endl; // cout выводит символы до конца строки, либо пока не встреит нулевой символ '\0'
        cout << &ch_arr1 << " : " << ch_arr1 << endl; // тот же cout
        strncpy(ch_arr0, ch_arr1, 9); // 1-й аргумент куда копировать, второй откда, третий сколько символов
        ch_arr0[9] = '\0'; // в конец чар-массива записать нулевой символ конца строки
        cout << &ch_arr0 << " : " << ch_arr0 << endl; 
        for (int i = 0 ; i < 30; i++) // вывод чар массива
            cout << i << " : " << ch_arr0[i] << endl;
     
     
     
        system("pause");
        return 0;
    }
    Запись от wareZ1400 размещена 07.04.2017 в 15:22 wareZ1400 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru