2015-07-01 39 views
0

我們都知道,以限定串的2-d陣列我們做指針從一個整數2-d陣列和在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]); 程序的時候是崩潰

我知道,自定義(一)我可以做如下

int(*p)[3]=a; then printf("%i",p[0][0]); 

我也知道如果我做int *a1[3]然後我創建一個指針數組,並避免我們把括號,所以爲什麼與int(*a1)[3]程序崩潰的定義?以及編譯器如何處理它?和這個案件和字符串char *c[5]的情況有什麼區別,如果我把char (*c)[5]和char沒有問題發生相同?

+0

是不是像' int(* a1)[3]'說_pointer指向3個ints_的數組,這不是您的定義嗎? –

+0

實際上,我對兩個定義int(* a1)[3]或int * a1 [3]感到困惑,我認爲它們都是一個指向a1的指針,以3個整數組成的數組,但compilar對待它們的方式不同,我錯了嗎? –

+1

打開編譯器警告。您正在使用整數加載初始化指向數組的指針。 – Quentin

回答

0

在聲明

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 s。

+0

你可以請[見此](http://ideone.com/BPBUs6)? –

+0

@NatashaDutta;是啊。現在沒有時間來解決這個問題。我刪除它。 – haccks

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