2012-04-28 51 views
0

Possible Duplicate:
gcc compile error: cast specifies array type是(int *)和(int [])是否相同?

我想檢查(int *)和(int [])的區別。當我編譯下面的代碼時,第一行很好。但是對於行2,我的編譯器提供了以下錯誤:

test.c:10: error: cast specifies array type 

任何一個可以告訴我這個錯誤的含義,我在哪裏犯了錯誤?

#include<stdio.h> 

void abc(int *a) 
{ 
     int i; 
     for(i=0;i<2;i++) 
     { 
      printf("%d",((int *)a)[i]); //(1) 
      printf("%d",((int [])a)[i]); //(2) 
     } 
} 

int main() 
{ 
    int b[2]={0,1}; 
    abc(b); 
    return 0; 
} 
+1

並不完全解決爲什麼你的轉換失敗,但http://stackoverflow.com/a/660812/567864很好地解釋了爲什麼int *和int []不是同一個東西,它們在內部與編譯器有何不同。 – Corbin 2012-04-28 10:54:01

回答

8

一般而言int *是一個指針(一個整數)而使用數組和int[]是未指定大小的數組,這是所謂的不完整的類型。不完整的類型只能在聲明中使用,並且必須在定義中完成。例如(下面的代碼就在於全球範圍):

extern int[] p; //declaration of p 

int p[5]; //definition of p - size must be specified 

當你談論函數的參數,它完全是另外一個故事。的聲明:

void f(int *p) 

void f(int p[]) 

將是相同的。如果你願意的話,它只是語法糖。


編輯:除此之外:如果你問數組和指針之間有什麼區別:一切!我會將您鏈接到C-faqs.com以獲得更具體的答案。

+0

上面給了你很好的答案感謝Anthales ...我得到了我的答案...... :) – 2012-04-28 11:01:37

+2

在這種情況下,點擊那個小接受按鈕會很好,這樣其他人就知道這個問題已經解決了。我也注意到你有另一個有很多答案但沒有被接受的答案的問題。 – Anthales 2012-04-28 11:12:43

0

根本不是。 int *表示指向內存中的整數的指針。 []括號代表一個數組。 int a [10];會產生10個整數的數組。 int * a;會產生一個指向整數的指針。

指針對於簡單類型並不是一個好習慣,因爲它們會消耗更多內存。

如需更多解答,請查看:http://www.cplusplus.com/doc/tutorial/arrays/http://www.cplusplus.com/doc/tutorial/pointers/

+0

在使用指向簡單類型的指針時能解釋更多的內存使用情況嗎? – patseb 2012-04-28 10:51:21

+1

*「它們消耗更多的內存」* - 您的意思是包含數據地址的「DWORD」或「QWORD」的每個實例多出4或8個字節?我會說指針讓它很容易忘記清除它們(即free()它們)是一個更大的問題。 – Polynomial 2012-04-28 10:51:36

+0

好吧,Polynomial已經表示人們僞造他們,並且他們會消耗額外的4或8個字節。爲什麼我需要額外的4或8個字節,如果沒有必要? – Majster 2012-04-28 10:53:48

1

試試這個

void abc(int *a){ 
    int i; 

    for(i=0;i<2;i++){ 
    printf("%d",*(a+i)); //(1) 
    printf("%d", a[i]); //(2) 
    } 
} 

你應該花更多的時間瞭解指針和數組。陣列的名稱是一個指向他的第一個元素,則可以使用它們的名稱等與所述存儲器件和指向它的指針開始

+0

我很瞭解這些事情。但是當我們在一個函數中傳遞數組時。我們可以保留int * a或int a []的形式參數嗎? 。爲什麼如此? – 2012-04-28 10:58:38

+0

@Anthales在 – vard 2012-04-28 11:05:42

相關問題