繁体   English   中英

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

[英]Why can't we initialize a 2D integer array as a pointer?

为什么将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 这些事物中的每一个本身都是一组(由三个事物组成)。 但是, xint *的数组。 x每个成员都应使用指针进行初始化。 但是{1,2,3}三件事情不是一个指针。

初始化数组和结构时,用于解释事物组的C规则有点复杂,因为它们旨在为省略括号提供一定的灵活性,因此我必须多研究一些标准以解释它们在此处的应用。 可以说编译器将声明解释为使用1初始化x[0] 由于1是一个intx[0]是一个int * ,因此编译器会抱怨类型不匹配。

补充说明

char *m[]不声明二维数组。 它是指向char的指针的数组。 由于C的规则,通常可以在语法上以与二维数组相同的方式使用它,因此m[i][j]选择字符串i字符j 但是, char *m[]char a[3][4]之间存在区别,例如:

  • m[i][j]m[i]是一个指针。 该指针是从内存中加载的,并用作[j]的基地址。 然后将j添加到该地址,并从内存中加载该字符。 在此评估中有两个内存负载。
  • a[i][j]a[i]是一个数组。 此数组的位置是从a的开头通过算术计算得出a 那么a[i][j]是一个char ,其地址通过加j来计算,并且那里的字符是从内存中加载的。 在此评估中有一个内存负载。

有一种语法可以初始化一个int指针数组,以指向一个int数组。 它称为复合文字 这是很少使用的:

int *x[] = { (int []) {1, 2, 3}, (int []) {4, 5, 6} };

这些字符串文字和复合文字之间的关键区别在于,字符串文字定义了在程序执行的整个生命周期内存在的对象,但是函数内部使用的复合文字具有自动存储持续时间,它将在函数返回时消失,并且可能会更早消失,具体取决于关于它的使用位置。 新手C程序员在了解存储期限规则之前应避免使用复合文字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM