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是一个’标量’,所以一次只能指向一个东西(一个地址)然后{。}。 ..}符号在这里不起作用。