Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

C++ разница между массивами

#cpp


Есть два массива: 


char *str
char* str[]


По своему принципу, это просто одномерный массив, но при этом, я не могу добавить
никаких значений во второй. 
Вопрос: какая между ними тогда разница? Зачем объявлять их именно в таком виде и
какой от этого плюс? 

Update

    


Ответы

Ответ 1



char* str[] (с пустыми квадратными скобками) — при использовании в качестве аргумента функции при её объявлении это то же самое, что и char **str. Как это дело трактовать — зависит исключительно от логики кода: Это может быть указатель на массив указателей (тогда можно сделать что-то наподобие char *foo = str[16];). Причём элементы массива могут указывать как на начало нуль-терминированных строк, так и на отдельные символы, хранящиеся где-то в другом месте. Это может быть просто указатель на char*-переменную, позволяющий модифицировать саму эту переменную отовсюду, куда мы передали этот указатель. Это может быть двумерный массив типа char. Такой массив называется jagged и, в отличие от традиционного, позволяет хранить разное количество элементов в каждой строке (если первый индекс обозначает номер строки) или столбце (если первый индекс обозначает номер столбца) char* str[N] (с некой константой в скобках) — это уже полноценный массив фиксированной длины, хранящий в себе N элементов типа char *. Однако в данном случае есть три важных момента: Это работает только при объявлении переменных. Если вы попытаетесь указать подобную конструкцию в качестве аргумента функции при её объявлении, содержимое квадратных скобок будет проигнорировано, и вы получите первый случай. Если вы совмещаете объявление массива с его заполнением (char* str = {...}), константу N можно опустить, тогда её значение будет вычислено автоматически. В C++ значение N должно быть именно константой, в противном случае вы получите ошибку компиляции. Массивы переменной длины разрешены только в Си не ранее C99.

Ответ 2



Первый - указатель на char, второй - массив указателей на char. Ну, или, грубо говоря - первое - это C-строка, второе - массив указетелей на эти строки (но не сами данные). Примерно так: char * str; str = new char[20]; strcpy(str, "Hello, world\n"); cout << str; delete[] str; const char* strs[] = { "Hello", "world" }; for(auto s: strs) cout << s << endl;

Ответ 3



В первом случае у вас просто указатель на char, а вот второй случай интереснее и совершенно не равен первому. char *str[] - это массив указателей на char. Тобишь его можно представлять как массив строк (что не совсем верно, но в общем случае можно и так). Тобишь если хотите чтобы указатель из массива указывал на нужную вам строку нужно что-то вроде: char alfa[] = "alfa"; char beta[] = "beta"; char *str[2]; str[0] = alfa; str[1] = beta;

Ответ 4



Первое это указатель на char, а второе в зависимости от контекста может быть либо массивом указателей, либо указателем на указатель (если это тип аргумента функции).

Комментариев нет:

Отправить комментарий