我正在努力理解C语言中的数组和指针以及它们之间的区别,但在处理二维数组时遇到了些麻烦。
关于普通的一维数组,我已经学习了以下内容:
char arr[] = "String constant";
创建一个字符数组,变量
arr
将始终表示初始化时创建的内存。char *arr = "String constant";
创建了一个指向字符数组"字符串常量"的第一个索引的char指针。该指针以后可能会指向其他位置。
char *point_arr[] = {
"one", "two","three", "four"
};
创建一个指向字符数组"one"、"two"等的指针数组。
我的问题
如果我们可以同时使用:
char *arr = "constant";
并且
char arr[] = "constant";
那么,为什么我不能使用以下内容:
char **pointer_arr = {
"one", "two", "three", "four"
};
替代
char *pointer_arr[] = {
"one", "two", "three", "four"
};
如果我尝试使用char **
,那么我会得到一个错误,如“标量初始化程序中存在过多的元素”。我可以通过使用calloc
来专门分配内存来使char**
示例工作,但是因为我不必像使用char *arr = "blah";
时那样做。我不明白为什么这是必需的,所以我真的不理解以下两者之间的区别:
char **arr_pointer;
并且
char *arr_pointer[];
非常感谢您提前给予的建议。
const
来表示字符串字面量是很好的风格,但并不是必须的。 - schotconst char *
到char *
的隐式转换只是为了兼容性而存在,并且可能(我不确定)已经在C99中被弃用。 - Matteo Italia