2Darrays和指针 – C.

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

对于普通的1Darrays,这是我所学到的:

char arr[] = "String constant"; 

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

 char *arr = "String constant"; 

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

 char *point_arr[] = { "one", "two","three", "four" }; 

创建一个指针数组,然后指向char数组“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[]; 

非常感谢您的建议。

简而言之,您不能使用{ ... }作为标量的初始化器。

char **arr_pointer声明一个标量,而不是一个数组。 相比之下,你可以做char *arr = "constant"; 是因为你仍然在声明一个标量,它恰好指向一个字符串文字。

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

在那里解释char [] vs char * 。 同样的事情可以扩展到char *[] vs char **

如果你真的想要深入了解它,那么尝试通过整数而不是字符来理解数组和指针。 根据我的经验,当涉及字符时,我无法理解指针和数组。 一旦你理解了正确的内容,你就会意识到它根本不是差异。

int * ptr []是一个指向整数的指针数组,其中int ** ptr是一个指向引用整数的指针的指针。

int * arrptrs [2];
arrptrs [0] =(int *)malloc(sizeof(int)* 5);
arrptrs [1] =(int *)malloc(sizeof(int) 5);
这初始化了由数组arrptrs的元素引用的两个数组。 数组的名称是指数组的第一个元素的内存位置,因此arrptrs的类型为(int * ),因为此数组的第一个元素是类型(int *)

假设我们做int ** ptr = arrptrs那么,* ptr是arrptrs的第一个元素,它是arrptrs [0]而*(ptr + 1)是arrptrs [1]而做* arrptrs [0]是第一个元素arrptrs [0]引用的数组。

我希望这有帮助,虽然我不确定你是否需要这个。

指针( char *pointer; )具有值; 数组( char array[]; )有元素。

声明char **ptr2声明一个可以取一个值的对象,而不是一个可以取几个元素的对象。

来自维基百科的报价:

在计算中,标量变量或字段是一次只能容纳一个值的字符……例如,char,int,float和double是C编程语言中最常见的标量数据类型。

正如Oli Charlesworth在他的回复中指出的那样,使用{…..}初始化多个项目但是因为char ** arr_pointer是一个’标量’,所以一次只能指向一个东西(一个地址)然后{。}。 ..}符号在这里不起作用。