如果p是個指標變數,為什麼p回完全等價與pi

2021-03-07 09:29:20 字數 2522 閱讀 2525

1樓:金色潛鳥

c 語言 p[i] 中 的中括號 不是標點符號,而是 地址 「運算子」(c 語言奇葩之一)。

p[i] 地址 等於 p+i

執行下面語句,可以看看,它們是地址,兩種計算方法得到的一樣吧!

double p=;

int i;

for (i=0;i<4;i++) printf("%u\n",p+i);

for (i=0;i<4;i++) printf("%u\n",&p[i]);

----------------------

語句裡 指標前加個星號,就是 該地址裡存放的 數值。

語句裡 p[i] 表示 是 &p[i] 地址 裡的 值。

語句裡 *(p+i) 是 p+i 地址裡存放的 數值.

上面計算知道 指標 p+i 和 &p[i] 地址 一樣。

他們的數值 p[i] == *(p+i)

-------------------

c 語言裡,實質上只有 一維陣列(多維,通過運算,還是1維),而指標是沒有分配儲存單元的一維陣列,或者說一維陣列是分配了儲存單元的指標。

上面例子,為簡單起見,直接寫 double p=;

願意 寫 宣告 double a=, *p; 語句: p = &a[0]; 或 p=a; 都可以。

2樓:向天致信

c語言p[i]中的中括號不是

標點符號,而是 地址 「運算子」。

p[i] 地址等於 p+i

執行下面語句

double p=;

int i;

for (i=0;i<4;i++) printf("%u\n",p+i);

for (i=0;i<4;i++) printf("%u\n",&p[i]);

語句裡,指標前加個星號,就是該地址裡存放的數值。

語句裡,p[i]表示是&p[i]地址裡的值。

語句裡 *(p+i)是p+i地址裡存放的數值.

上面計算知道指標p+i和&p[i]地址一樣。

他們的數值p[i] == *(p+i)

c語言裡,實質上只有一維陣列(多維,通過運算,還是1維),而指標是沒有分配儲存單元的一維陣列,或者說一維陣列是分配了儲存單元的指標。

上面例子,為簡單起見,直接寫 double p=。

3樓:v5丶丶

資料名實質上是一個指標常量(即一個具體的地址值)。當把一個指標變數p指向一個陣列a時,其實就是把陣列名a這個指標常量賦給了指標變數p,此時p與a是等價的,p[i]即a[i]。

而指標變數的+1操作,並不是真的其值就比原值多1,而是按其指向的資料型別來決定增加多少。因此當指向陣列a的指標p每+1便指向陣列中的下一個元素,+i當然就指向陣列中第i個元素,即*(p+i)等價於a[i]等價於p[i]。

4樓:匿名使用者

這個是不能隨便這麼寫的。因為p必須是陣列的指標,可以不是指標。因為陣列的記憶體分佈是連續的,p+i,實質是指向p陣列的第i個元素的指標,*(p+i)就是這個指標的內容,所以與p[i]相同。

其實i就是個偏移量。理論上p是一個地址,p+i值為p+i*單個元素的位元組長度

5樓:o雲未央

p作為一個指標變數,p[i]表示p指向的一段連續記憶體中的第i個偏移位置,等同於陣列下標呼叫。

*(p+i)就是去p指向的位置偏移i個偏移量,然後*解引用取得那個點的值。

例如:int a[10] = ;

int *p = a;

int i = 5;

此時p指向a陣列的首地址,即a[0]的位置,設為0x8000f000。因為是int 型的指標,則其偏移量為 int 型所佔位元組數,以int 型所佔位元組數為4來說,此時p的偏移量為4位元組

則p+i指向a[5]的地址,即 0x8000f000 + 5*4的位置,*(p+i)就取得a[5]的值了

如果取p = &a;

則p+1指向的不是a[1],而是a[10],剛好越界的那個點。因為此時p的偏移量以整個陣列a的長度來計算,+1就加到了陣列的末尾。

6樓:

p[i]跟陣列等效,但不是陣列,理解這個問題,你需要理解陣列與指標的區別。陣列的首地址在編譯後是不可變的並且編譯器已經獲取了其地址值。比如說運算元組p的第i個元素的值,編譯器只需要進行2步,1.

編譯器獲取第i元素的地址,2.讀取或寫入值。指標它的指向是可變的,所以編譯器在對其操作時會進行3步,1.

讀取指標p的值,2.基於指標的型別進行偏移(假定指標為int型別,cpu為32為,這p[i]的地址值就為,p的值加上4*i),3.對其進行操作。

*(p+i)也可以同樣進行這樣理解,基於首地址的一個偏移。希望對你有幫助,寫的匆忙,有錯求指點

書上說:「如果p的初值為&a[0,]指向陣列的指標變數也可以帶下標,如p[i]與*(p+i)等價」

7樓:玄殤隕

誤不誤會都無所謂,指向陣列的指標變數和陣列無多大區別,只是書寫形式不同而已,都是儲存這記憶體空間的首地址,所以說他們2個本質是相同的。

C語言中「指標變數P自增1」是什麼意思

自增就是 1的意思,地址 1就是指向下一個元素。例如int array 3 int p array 此時p指向array 0 p 這裡的p自增,執行後p指向array 1 計算機c語言中 指標變數p自增1 什麼意思 自增就是 1的意思,地址 1就是指向下一個元素。例如int array 3 int ...

C語言中的指標是個什麼型別的變數

1.指標的型別 就是 指標 指標大小和記憶體的編址方式有關,只是恰好與無符號整形大小相同他的大小是 4位元組 32位 就是類似 0012ff78 16進位制 32位 注 如果你的電腦是64位電腦 那麼他的大小就是8位元組 2.指標是用來儲存 記憶體地址的 記憶體有 按32位編制 和按64位編制之分 ...

停車場是parking lot為什麼不是park lot

形容詞可以復修飾名詞,beautiful girls漂亮的制女孩名詞可以修飾名詞,water pipe水管但是從來沒見過動詞修飾名詞的。把動詞park變成動名詞parking再與名詞合成,是個比較常用的方法。driving license駕照 因為park表示泊車這個意思時是動詞,加上ing可以使其...