为什么将2D字符数组初始化为指针,但不能初始化为2D整数数组?为什么在尝试这样做时会出现错误?另外,将数组初始化为指针意味着什么?
#include<stdio.h>
int main()
{
char* m[] = { "Excellent","Good", "bad" };
int* x[] = { {1,2,3},{4,5,6} };
return 0;
}
在声明的背景下,{
与}
仅仅意味着“这里是一组的事情。” 它们不代表对象,地址或数组。(注意:在初始化中,有一些表达式,并且这些表达式可以在确实表示对象的某些上下文中包含花括号。但是,在问题所示的代码中,花括号只是对事物进行了分组。)
在char* m[] = { "Excellent","Good", "bad" };
三个项目列示初始化m
:"Excellent"
,"Good"
,和"bad"
。因此,每个项目都会初始化的一个元素m
。
"Excellent"
是字符串文字。在编译过程中,它成为字符数组,以空字符终止。在某些情况下,数组将保留为数组:
sizeof
。&
(用于获取地址)时。这些都不适用于这种情况。"Excellent"
不是的操作数sizeof
,不是的操作数&
,它只是初始化的一个元素m
,而不是初始化整个数组。因此,该数组不会保留为数组:根据C中的规则,它会自动转换为指向其第一个元素的指针。然后,此指针初始化m[0]
:m[0]
是的第一个元素的指针"Excellent"
。
类似地,m[1]
被初始化的指针的第一个元素"Good"
,和m[2]
被初始化的指针的第一个元素"bad"
。
在中int* x[] = { {1,2,3},{4,5,6} };
,列出了两件事进行初始化x
。这些事物本身都是一组(由三个事物组成)。但是,x
是的数组int *
。的每个成员x
都应使用一个指针进行初始化。但是,由三点组成的一组{1,2,3}
不是指针。
初始化数组和结构时,用于解释事物组的C规则有点复杂,因为它们旨在为省略括号提供一定的灵活性,因此,我必须更多地研究标准以解释它们在此处的应用。只需说编译器将声明解释为1
用于初始化即可x[0]
。由于1
是int
和x[0]
是int *
,编译器会抱怨类型不匹配。
char *m[]
不声明二维数组。它是的指针数组char
。由于C的规则,通常可以在语法上以与二维数组相同的方式使用它,从而m[i][j]
挑选出j
string的字符i
。但是,char *m[]
和之间有区别char a[3][4]
,例如:
m[i][j]
,m[i]
是一个指针。该指针是从内存中加载的,并用作的基地址[j]
。然后j
将其添加到该地址,并从内存中加载该字符。在此评估中有两个内存负载。a[i][j]
,a[i]
是一个数组。此数组的位置是从算术运算开始的a
。然后a[i][j]
是一个char
,其地址通过加来计算j
,然后从内存中加载该字符。在此评估中有一个内存负载。有一种语法可以初始化一个int
指针数组,以指向的数组int
。它称为复合文字。这是很少使用的:
int *x[] = { (int []) {1, 2, 3}, (int []) {4, 5, 6} };
这些字符串文字和复合文字之间的关键区别在于,字符串文字定义了在程序执行的整个生命周期内存在的对象,但是函数内部使用的复合文字具有自动存储持续时间-当函数返回时(可能更早),它会消失,具体取决于关于它的使用位置。新手C程序员在了解存储期限规则之前应避免使用复合文字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句