首页 > 解决方案 > 为什么我们不能将二维整数数组初始化为指针?

问题描述

为什么二维字符数组可以初始化为指针而不是二维整数数组?为什么我尝试这样做时会出错?另外,将数组初始化为指针是什么意思?

#include<stdio.h>
int main()
{
    char* m[] = { "Excellent","Good", "bad" };
    int* x[] = { {1,2,3},{4,5,6} }; 
    return 0;                      
}

标签: c

解决方案


在声明的上下文中,{}表示“这里是一组事物”。它们不代表对象、地址或数组。(注意:在初始化中,有表达式,这些表达式可以在某些表示对象的上下文中包含大括号。但是,在问题中显示的代码中,大括号只是对事物进行分组。)

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 规则有点复杂,因为它们旨在为省略大括号提供一些灵活性,所以我必须更多地研究标准来解释它们如何应用在这里。只需说编译器将声明解释为 using 1to initialize 即可x[0]。由于1is anintx[0]is an 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]是 a char,它的地址是通过加 计算出来的j,那里的字符是从内存中加载的。此评估中有一个内存负载。

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

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

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


推荐阅读