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