指针不同于整数2-D数组和c中的字符串

时间:2015-07-01 14:55:36

标签: c arrays string pointers

我们都知道要定义一个二维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]的情况有什么不同呢?

2 个答案:

答案 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>