为什么我们不能将2D整数数组初始化为指针?

MMH

为什么将2D字符数组初始化为指针,但不能初始化为2D整数数组?为什么在尝试这样做时会出现错误?另外,将数组初始化为指针意味着什么?

#include<stdio.h>
int main()
{
    char* m[] = { "Excellent","Good", "bad" };
    int* x[] = { {1,2,3},{4,5,6} }; 
    return 0;                      
}
埃里克·波斯蒂奇(Eric Postpischil)

在声明的背景下,{}仅仅意味着“这里是一组的事情。” 它们不代表对象,地址或数组。(注意:在初始化中,有一些表达式,并且这些表达式可以在确实表示对象的某些上下文中包含花括号。但是,在问题所示的代码中,花括号只是对事物进行了分组。)

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]由于1intx[0]int *,编译器会抱怨类型不匹配。

补充说明

char *m[]不声明二维数组。它是的指针数组char由于C的规则,通常可以在语法上以与二维数组相同的方式使用它,从而m[i][j]挑选出jstring的字符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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不能用从类型变量未初始化的局部变量访问静态内容?

为什么我们不能调用servlet构造函数而不是init方法来初始化config参数?

为什么我们不能使用构造函数本身来初始化servlet?

为什么我们不能通过未初始化的局部变量访问静态内容?

为什么我们不能将List <A>强制转换为List <B>

为什么我们不能迅速在扩展中添加指定的初始化程序?

为什么我们不能比较不指向同一数组中元素的指针?

为什么我们不能将字符串值分配给2d char数组?

为什么可以将char指针变量初始化为字符串,但不能将int指针变量初始化为整数数组?

当我尝试发送2D整数数组时,为什么MPI_Send会阻塞?

C-创建3D整数数组并将其初始化为零

为什么2D数组的行为就像1D指针数组而不是1D整数数组?

为什么不能将Worksheets对象变量初始化为Worksheets集合?

为什么我们添加一个值以在程序集中初始化堆栈指针(R7)?

itemgetter如何工作?当我们将其初始化为密钥时会发生什么

为什么我不能使用指针初始化数组?

为什么可以在std :: array中将char初始化为nullptr,而不能将其初始化为null?

为什么我们不能直接将arr分配给数组指针

在C ++中将2D指针数组初始化为成员变量

为什么取消对整数数组的指针(在2d数组中)的返回(或衰减到)指向第一个元素的指针?

PHP为什么不能将静态变量初始化为time()?

我们可以在方法内部创建IIB(实例初始化块)吗?如果我们不能为什么不给出编译时错误呢?

为什么我们不能将函数绑定到 :disabled 输入字段?

为什么我们需要浮点指针或整数指针分别指向浮点变量或整数变量?

为什么我们不能使用scanf直接初始化struct中的变量?

为什么我们要初始化 webelement?

为什么我们不能延迟使用非默认构造函数初始化类成员?

我们什么时候将函数内的函数调用初始化为参数?

为什么我们不能在 C++ 中比较函数数组的类型?