2D阵列和指针 - C.

Joe*_*Joe 3 c arrays pointers

只是试图真正让我的头围绕C中的数组和指针以及它们之间的差异,并且在使用2d数组时遇到了一些麻烦.

对于普通的1D阵列,这是我所学到的:

char arr[] = "String constant";
Run Code Online (Sandbox Code Playgroud)

创建一个字符数组,变量arr将始终表示初始化时创建的内存.

char *arr = "String constant";
Run Code Online (Sandbox Code Playgroud)

创建一个指向char的指针,该指针当前指向char数组"String constant"的第一个索引.指针可以稍后指向其他地方.

char *point_arr[] = {
    "one", "two","three", "four"
};
Run Code Online (Sandbox Code Playgroud)

创建一个指针数组,然后指向char数组"one","two"等.

我的问题

如果我们可以同时使用:

char *arr = "constant";
Run Code Online (Sandbox Code Playgroud)

char arr[] = "constant";
Run Code Online (Sandbox Code Playgroud)

那为什么我不能用:

char **pointer_arr = {
    "one", "two", "three", "four"
};
Run Code Online (Sandbox Code Playgroud)

代替

char *pointer_arr[] = {
    "one", "two", "three", "four"
};
Run Code Online (Sandbox Code Playgroud)

如果我尝试这char **件事,那么我会得到一个错误,比如"标量初始化器中的多余元素".我可以char**通过使用专门分配内存来使示例工作calloc,但因为我没有必要这样做char *arr = "blah";.我不明白为什么它是必要的,所以我真的不明白它们之间的区别:

char **arr_pointer;
Run Code Online (Sandbox Code Playgroud)

char *arr_pointer[];
Run Code Online (Sandbox Code Playgroud)

非常感谢您的建议.

Geo*_*rge 5

请参阅C FAQ中的以下答案:

在那里,它被用于解释char []VS char *.同样的事情可以扩展到char *[]VS char **.