#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, а второе в зависимости от контекста может быть либо массивом указателей, либо указателем на указатель (если это тип аргумента функции).
Комментариев нет:
Отправить комментарий