如何理解「如果p是個指標變數,則p永遠等價於 p i 」這句話

時間 2021-09-11 22:25:28

1樓:金色潛鳥

如果宣告 了 p 是指標, 那麼語句裡 p[i] 是數值,它 等於數值 *(p+i)。無論是什麼型別。

例如:#include

void main() ,*p=a,i;

double b[5]=, *pp=b;

for (i=0;i<5;i++) printf("%d %d\n",p[i],*(p+i));

printf("**********=\n");

for (i=0;i<5;i++) printf("%g %g\n",pp[i],*(pp+i));

} 輸出:

10 10

12 12

14 14

16 16

18 18

**********=

20 20

22 22

24 24

26 26

28 28

2樓:老猴子不會胖

陣列元素有兩種表示方法

a[i] 下標法

*(a+i)指標法

若p指向陣列首地址,那麼p[i]等價於*(p+i)其實陣列下標法為的是寫起來簡單,容易,編譯執行時都用的地址法來尋找陣列元素

如果p是個指標變數,則p[i] 永遠等價於 *(p+i), 這句話是什麼意思 求大神細說

3樓:匿名使用者

就是說,p[i]和*(p+i)意思一樣,表示同一「變數」。

或許你已經聽說過,陣列名本身就是指標。如:

int a[5];

那麼,a就是一個指標,它指向陣列的第一個元素。反過來,每一個指標都可以當做一個陣列來用。如:

char *p="0123";

那麼,編譯器會分配5位元組儲存字串「0123」,而p則指向第一個字元'0'。所以,*p=='0',*(p+3)=='3'(如果樓主指標運算學得好的話,應該不難理解)。其實,你完全可以不用*運算子,由「等價」可知:

p[0]=='0',p[3]=='3'

如果p是個指標變數,p[i]永遠等價於*(p+i) 這個怎麼理解,什麼意思?要詳細

4樓:匿名使用者

就是說,p[i]和*(p+i)意思一樣,表示同一「變數」。 或許你已經聽說過,陣列名本身就是指標。如:

int a[5]; 那麼,a就是一個指標,它指向陣列的第一個元素。反過來,每一個指標都可以當做一個陣列來用。如:

char *p="0123"; 那麼,編譯器會分配5位元組儲存字串「0123」,而p則指向第一個字元'0'。所以,*p=='0',*(p+3)=='3'(如果樓主指標運算學得好的話,應該不難理解)。其實,你完全可以不用*運算子,由「等價」可知:

p[0]=='0',p[3]=='3'

5樓:

因為陣列的第一個元素就是一個指標,*(p+1)就是第二個元素,*(p+0)表示第一個元素*p也表示第一個元素。

6樓:刑語煒

那是它們的地址相等!

7樓:earth塵林

這是指標的兩種不同表示啊

如果p是個指標變數,為什麼p[i]回完全等價與*(p+i) *(p+i)是什麼意思?

8樓:金色潛鳥

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; 都可以。

9樓:向天致信

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

10樓:v5丶丶

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

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

11樓:匿名使用者

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

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

12樓: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就加到了陣列的末尾。

13樓:

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)等價」

14樓:玄殤隕

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

是一維陣列,定義指標變數int p,那麼請問p a與p a的區別是什麼

自我程式設計 在陣列中,陣列名錶示首地址常量。a等同於 a 0 所以p a。就是p指向a首地址。p a是錯的,a已經是地址裡。可以寫p a 0 天天向上知識店鋪 如果已定義int a 5 定義指標變數int p,那麼請問p a這意思是p指標指向a陣列的首地址,相當於p a 0 p a的寫法是錯的。因...

能講一下C語言形參如果是指標變數如何使用嗎

一般來說在函式中如果最終要返回或者設定什麼結果,通常是定義一個變數 與你結果相同資料型別 在程式中進行運算,之後再返回或者再設定,這樣主要是為了方便和好理解,具體到你這題上,因為最終結果是要放在 n裡,它的初始值也是0,所以不要j這種中間變數也是可以的,比如說可以是 void fun int a,i...

定義了結構體,結構體有個成員變數是指標型別,而這個變數有是結構體,請問怎麼對這個指標初始化

例如有a,b兩個結構體,a中有b 在main中需要先初始化個b,完成b之後,然後呼叫a.b,這樣就可以完成了!如果直接呼叫a的話,有可能溢位 沒賦具體值時都給null就好 struct a a struct a malloc sizeof struct a memset a,0,sizeof str...