2014-07-10 85 views
0

我在寫這個程序 -爲什麼當p指向一個數組時,p和* p會給出相同的地址?

#include<stdio.h> 

void main() 
{ 
    int arr[20]; 
    arr[0]=22; 
    arr[1]=23; 
    int (*p)[20]=&arr; 
    printf("address in p :%u:\n",p); 
    printf("address in *p:%u:\n",*p); 
} 

這段代碼的輸出是同爲p和* P!據我所知,* p持有arr的基地址,這只是arr [0] !!! 所以* p應該給出輸出22!但它顯示出像p一樣的內存地址。請告訴我爲什麼會發生這種情況?背後的原因是什麼?
鍵盤站點鏈接:http://codepad.org/LK7qXaqt

+2

使用'%p'打印數據指針 –

+0

p ==&ARR,* P == ARR,* P = ARR [0],同一個地址的ARR,&ARR [! 0],&arr。 (* p)[0] == 22或** p == 22. – BLUEPIXY

+2

Closely [related](http://stackoverflow.com/a/24468853/2455888)。 – haccks

回答

5

p是指向整數20數組的指針。數組的第一個字節的地址被認爲是數組的地址。解引用它會給整個數組本身。因此*p代表數組arr,因此您可以將*p視爲數組名稱。
由於數組名稱在傳遞給函數時轉換爲指向其第一個元素的指針,因此*p將衰減爲指向第一個元素arr。因此

printf("address in *p: %p:\n", (void*)*p); 

將打印的陣列arr第一元件地址而

printf("address in p: %p:\n", (void*)p); 

將打印整個數組的地址(即第一字節陣列的)。由於的第一個字節值的第一個元素是相同的,所以兩者都打印相同的地址。

對於詳細的解釋:Stack Overflow http://cdn.sstatic.net/stackoverflow/img/favicon.icoWhat exactly is the array name in c?

+0

謝謝!現在很容易理解。 :) – Satyaki

5

因爲p和* p指向同一個內存位置僅如果打印p+1*p + 1你應該看到其中的差別

int (*p)[20]聲明有類型不同

+-+-+-+-+-+-+-+-+-+-+-+-+ 
    | | | | | | | | | | | | | 
    +-+-+-+-+-+-+-+-+-+-+-+-+ 
arr [      ] 
    p [      ] 
(*p)[ ] 

p as pointer to array of size 20 of type int因此在同一時間*p是指向數組的第一個元素的指針。

第一個元素和整個數組的地址是相同的。

+0

但* p應該給存儲在指針中地址中的實際值嗎?是不是? – Satyaki

+0

'p'是數組的地址,'* p'是第一個元素的地址(即'int'),'** p'是存儲在第零個索引中的實際值。而且'p + 1'是超出數組的地址,'* p + 1'是第0個元素之外的地址,即第一個索引處的元素。 –

+0

@MohitJain; '* p [i]'不會給'arr [i]'。 – haccks

0

是的,可以將地址運算符應用於數組,雖然看起來多餘。結果p是一個指向數組的指針。這種事情在正常情況下很少遇到。正如@Mohit指出的那樣,它指向的對象是整個數組,這意味着sizeof(* p)應該是數組的大小(不是它的第一個元素)。

* p邏輯上是數組然後;像往常一樣,它在作爲參數傳遞時衰減到指向其第一個元素(它是一個int)的指針,例如,到printf。由於它是第一個元素,它在內存中的位置就是整個數組的開始位置。

+0

謝謝。 :)現在它對我很清楚。 – Satyaki

相關問題