Просто пытаюсь по-настоящему разобраться с массивами и указателями в C и различиями между ними, и у меня возникли проблемы с двумерными массивами.
Для обычного 1D массива это то, что я выучил:
char arr[] = "String constant";
создает массив символов, а переменная arr
всегда будет представлять память, созданную при ее инициализации.
char *arr = "String constant";
создает указатель на char, который в данный момент указывает на первый индекс массива char "String constant". Указатель может указывать куда-нибудь еще позже.
char *point_arr[] = {
"one", "two","three", "four"
};
создает массив указателей, которые затем указывают на массивы символов "один, два" и т. Д.
Мой вопрос
Если мы можем использовать оба:
char *arr = "constant";
и
char arr[] = "constant";
тогда почему я не могу использовать:
char **pointer_arr = {
"one", "two", "three", "four"
};
вместо
char *pointer_arr[] = {
"one", "two", "three", "four"
};
Если я попробую char **
, я получу ошибку типа «лишние элементы в скалярном инициализаторе» Я могу заставить работать пример char**
, выделив память с помощью calloc
, но мне не пришлось делать это с char *arr = "blah";
. Я не понимаю, почему это необходимо, и поэтому я не понимаю разницу между:
char **arr_pointer;
и
char *arr_pointer[];
Заранее большое спасибо за совет.