【发布时间】:2010-10-08 09:28:03
【问题描述】:
只是想真正了解 C 中的数组和指针以及它们之间的差异,并且在使用 2d 数组时遇到了一些问题。
对于普通的一维数组,这是我学到的:
char arr[] = "String constant";
创建一个字符数组,变量arr将始终表示初始化时创建的内存。
char *arr = "String constant";
创建一个指向 char 的指针,该指针当前指向 char 数组“字符串常量”的第一个索引。指针可以稍后指向其他地方。
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 ** 的事情,那么我会收到类似“标量初始化程序中的多余元素”的错误。我可以通过使用calloc 专门分配内存来使char** 示例工作,但因为我不必对char *arr = "blah"; 执行此操作。我不明白为什么它是必要的,所以我真的不明白两者之间的区别:
char **arr_pointer;
和
char *arr_pointer[];
非常感谢您的建议。
【问题讨论】:
-
相当确定这是重复的...
-
稍微相关一点,第二、第三和第四个例子应该是
const。 -
@Matteo:
const字符串文字的风格很好,但在 C 中不是必需。 -
@schot:这不是必需的,但 IIRC 将字符串文字的
const char *隐式转换为char *只是出于兼容性原因,并且可能(我不确定)甚至在 C99 中已被弃用。