Есть два массива:
char *strchar* str[]По своему принципу, это просто одномерный массив, но при этом, я не могу добавить никаких значений во второй. Вопрос: какая между ними тогда разница? Зачем объявлять их именно в таком виде и какой от этого плюс?
Update
char* str[] (с пустыми квадратными скобками) — при использовании в качестве аргумента функции при её объявлении это то же самое, что и char **str.
Как это дело трактовать — зависит исключительно от логики кода:
Это может быть указатель на массив указателей (тогда можно сделать что-то наподобие char *foo = str[16];). Причём элементы массива могут указывать как на начало нуль-терминированных строк, так и на отдельные символы, хранящиеся где-то в другом месте.
Это может быть просто указатель на char*-переменную, позволяющий модифицировать саму эту переменную отовсюду, куда мы передали этот указатель.
Это может быть двумерный массив типа char. Такой массив называется jagged и, в отличие от традиционного, позволяет хранить разное количество элементов в каждой строке (если первый индекс обозначает номер строки) или столбце (если первый индекс обозначает номер столбца)
char* str[N] (с некой константой в скобках) — это уже полноценный массив фиксированной длины, хранящий в себе N элементов типа char *.
Однако в данном случае есть три важных момента:
Это работает только при объявлении переменных. Если вы попытаетесь указать подобную конструкцию в качестве аргумента функции при её объявлении, содержимое квадратных скобок будет проигнорировано, и вы получите первый случай.
Если вы совмещаете объявление массива с его заполнением (char* str = {...}), константу N можно опустить, тогда её значение будет вычислено автоматически.
В C++ значение N должно быть именно константой, в противном случае вы получите ошибку компиляции. Массивы переменной длины разрешены только в Си не ранее C99.
Первый - указатель на 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;
В первом случае у вас просто указатель на char, а вот второй случай интереснее и совершенно не равен первому.
char *str[] - это массив указателей на char. Тобишь его можно представлять как массив строк (что не совсем верно, но в общем случае можно и так). Тобишь если хотите чтобы указатель из массива указывал на нужную вам строку нужно что-то вроде:
char alfa[] = "alfa";
char beta[] = "beta";
char *str[2];
str[0] = alfa;
str[1] = beta;
Первое это указатель на char, а второе в зависимости от контекста может быть
либо массивом указателей, либо указателем на указатель (если это тип аргумента функции).
Сборка персонального компьютера от Artline: умный выбор для современных пользователей