繁体   English   中英

指针不同于整数二维数组和c中的字符串

[英]Pointers differ from an integer 2-D array and a string in c

我们都知道定义二维字符串数组

  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 (*c)[5]并且char没有问题的话,这是相同的?

在声明中

int (*a1)[3]={{20,60,30},{40,90,180},{200,880,900}};  

a1是一个指针(指向3个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的数组的数组char秒。

首先这个声明

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

暂无
暂无

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

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