簡體   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