2017-07-15 192 views
0

我知道只有數組名稱本身具有該數組第一個元素地址的值。例如,int num [] = {1,2,3}; so num的值爲& num [0]和一個單獨的地址。但是,當我嘗試找到此地址爲num時,它給了我與& num [0]相同的地址。他們不應該有不同的地址num and & num [0]數組指針的地址

int main(){ 
    int num[4]={1,2,3,4}; 
    int* int_ptr = num; 
    printf("%d\n", &num[0]); 
    printf("%d\n", num); 

    printf("%d\n", &num); 
    printf("%d", int_ptr); 
} 

我的輸出是:

6422268 
6422268 
6422268 
6422268 
+3

使用'%p'打印指針值。而'num'是'#num [0]'好的。該數組的地址是它的第一個元素的地址。也適用於指針。但是'#num num'只適用於數組。 –

+2

「我瞭解到,只是數組名稱本身指向該數組的第一個元素」 - 您學到了錯誤。數組不是指針! – Olaf

+0

@Olaf哦,我的壞。我的意思是它包含該數組的第一個元素的地址。 –

回答

5

想象一下隊列中的人和某人指向隊列中的第一個人(這是您的「第一個元素的地址」)。現在想象另一個人指着整個隊列。這兩個人是否指向相同的方向?

如果你告訴他們指向下一個元素(第一個隊列中的第二個人,另一個隊列是另一個隊列),該怎麼辦?

看到區別?

int arr[1000]; 
&arr[0] + 1 == &arr[1] 
&arr + 1 == <pointer to inexistent array[1000] of int> 
-1

NUM指向的數組中的第一項,相同& NUM [0]。這就是爲什麼他們都給你同樣的地址。 也使用%p打印地址

+0

這不是問題。 –

+0

你問:「他們不應該有不同的地址num和#[0]。」答案是它們都指向內存中的相同地址。所以不,他們不會假設有不同的地址(如果你的意思是指向)。 你對你的問題並不十分清楚 – roy360

0

否作爲位於內存某處的指針,不存在becacuse num,它只是連續內存中用於容納表元素的地址。它只是計算出來的東西,但不是作爲一個單獨的「物理」指針對象存在。所以num,& num和& num [0]地址完全相同,並指向存儲表元素的內存的開始位置。

試分析這個例子:

int main() 
{ 

    int num[10]; 
    int *numptr = num; 

    printf("num = %p, &num = %p, &num[0] = %p\n\r", num, &num, &num[0]); 
    printf("numptr = %p, &numptr = %p, &numptr[0] = %p\n\r", numptr, &numptr, &numptr[0]); 

    return 0; 
} 

其結果是:

num = 0000001F3C2FFAB0, &num = 0000001F3C2FFAB0, &num[0] = 0000001F3C2FFAB0 
numptr = 0000001F3C2FFAB0, &numptr = 0000001F3C2FFAD8, &numptr[0] = 0000001F3C2FFAB0