Любой из них. Обратите внимание, что это одна вещь, почти все запутывается о в С.
char ** a;
Здесь a
указатель на один или несколько указателей на один или несколько символов. В памяти есть куча указателей, и каждый указывает на строку (так сказать). a
относится к первому из этих указателей. (a+1)
относится ко второму. Каждый из блоков символов находится где-то в памяти, но не обязательно рядом друг с другом. Вы можете сделать это:
for (int i = 0 ; i < 10 ; ++i) {
a++ = malloc(100);
}
или вы могли бы сделать это:
char *b = malloc(1000);
for (int i = 0 ; i < 10 ; ++i) {
a++ = b;
b += 100;
}
И вы наполнили в массиве с 10 указателями на 100 символов. (Ну, на самом деле места для 100 символов, так как мы не заполняли ни символы, которые еще.)
char* a[];
Здесь, опять же, a
это куча указателей на первую кучу персонажей. Это действительно то же самое, что и char ** a
, но имеет смысл, если вы собираетесь их повторно использовать.
for (int i = 0 ; i < 10 ; ++i) {
a[i] = malloc(100);
}
, который будет делать то же самое, что и выше, но облегчает возврат к любому заданному блоку символов. Например, мы могли бы сделать strcpy(a[4], "Bob was here");
char a[][];
Это немного отличается тем, что это указатель на кучу символов, которые могут быть разбиты на блоки одинаковой длины. Обычно вы даете размеры в этом случае, если его слишком большой размер для размещения в стеке. char a[10][100]
выделил бы 1000 символов в памяти, разделенных на 10 групп по 100 штук.
Обратите внимание, что ваш пример {"0a","0b","0c"};
- это способ выделения трех блоков памяти. Каждый имеет длину три байта и предварительно заполняется с персонажами там (и закрытие \ 0 символ
Вы можете получить некоторые подсказки, если вы читали о [по часовой стрелке/спираль правила] (HTTP://c-faq.com/decl/spiral.anderson.html). –
@JoachimPileborg: Стоит ссылка! – deepmax
@MM. Это хорошо для многих продвинутых объявлений, но может быть не идеально для этого случая. Например, объявление 'char * v [K] [L];', не совсем ясно, что мы должны пропустить указатель в первом «раунде» и перейти непосредственно ко второму массиву. –