我们都知道要定义一个二维D字符串数组
char *c[5] = {"string1", "string2", "string3", "string4", "string5"};
或
char c1[][10] = {"string1", "string2", "string3", "string4", "string5"};
当我得到其中一个的值时,我们做`printf("%c",c [1] [0]); //只是示例
但在宣布时
int a[][3]={{20,60,30},{40,90,180},{200,880,900}}; //no problem with getting the output from
但在宣布时
int (*a1)[3]={{20,60,30},{40,90,180},{200,880,900}};
并尝试获取输出printf("%i",a1[0][0]);
程序崩溃
我知道从(a)的定义我可以做如下
int(*p)[3]=a; then printf("%i",p[0][0]);
并且我也知道我是否int *a1[3]
然后我创建了一个指针数组,并且为了避免我们放置括号,那么为什么程序崩溃时int(*a1)[3]
的定义?以及编译器如何处理它?如果我放char *c[5]
并且char没有问题,那么这个案例与字符串char (*c)[5]
的情况有什么不同呢?
答案 0 :(得分:0)
在声明中
operator<<
int (*a1)[3]={{20,60,30},{40,90,180},{200,880,900}};
是一个指针(指向3 a1
s的数组)。您无法使用上述初始化程序对其进行初始化。您可以通过举例
int
您无法将int a[] = {1, 2, 3};
int *p = a;
初始化为
p
因为int *p = {1, 2, 3};
是一个指针,而不是数组。那说指针不是数组。
你应该注意声明
p
和
char *c[5] = {"string1", "string2", "string3", "string4", "string5"};
彼此完全不同。
前者将char c1[][5] = {"string1", "string2", "string3", "string4", "string5"};
声明为c
指向5
的数组,而后者声明char
数组c1
s。
答案 1 :(得分:0)
首先是这个宣言
char *c[5] = {"string1", "string2", "string3", "string4", "string5"};
未声明2D数组。它是一个指向字符串文字的一维指针数组。
此声明
char c1[][10] = {"string1", "string2", "string3", "string4", "string5"};
确实是2D数组的声明。
此声明
int (*a1)[3]={{20,60,30},{40,90,180},{200,880,900}};
无效,编译器应发出诊断消息。在这个声明中,a1
是一个标量对象,如果有多个初始值设定项,并且在括号中有封闭的初始值设定项时,它可能不会被大括号中的初始值设定项列表初始化。
标量对象可以由仅包含一个初始值设定项的括号列表初始化,例如
int x = { 10 };
根据C标准(6.7.9初始化)
11标量的初始值设定项应为单个表达式, 可选地用括号括起来。
但您可以使用复合文字
执行以下操作#include <stdio.h>
int main( void )
{
int ( *a1 )[3] = ( int[][3] )
{
{ 20, 60, 30 },
{ 40, 90, 180 },
{ 200, 880, 900 }
};
for ( size_t i = 0; i < 3; i++ )
{
for ( size_t j = 0; j < 3; j++ ) printf( "%d ", a1[i][j] );
printf( "\n" );
}
}
程序输出
20 60 30
40 90 180
200 880 900
在此程序声明int ( *a1 )[3]
中声明一个指向类型为int[3]
的数组的指针。这是在声明的右侧有一个复合文字,其类型为int [3][3]
(一个2D数组),它被隐式转换为指向其第一个元素的指针,并且该值被赋值给a1
< / p>