請教C語言指標中p p ip i p區別一直感覺很迷茫

2021-03-17 19:21:35 字數 4331 閱讀 4115

1樓:匿名使用者

假如你有這樣的定義:int p[10];

則:&p[0] 是陣列p的第乙個元素的位址,跟p一樣都是陣列p的起始位址

p+i 由於p是陣列的起始位址,則p+i就是從起始位址開始向後偏移i個位置的元素的位址,如:p+2 表示的是元素p[2]的位址&p[2]

p[i] 是指數組下標為i的元素。

對於一維陣列來說有乙個恆等式:p[i]=*(p+i) 變化一下就變成:p+i=&p[i]

2樓:屋哥

p[0] 和p[i]差不多,都是取值

*(p+i) 和p[i]一回事

&p[0]是取p[0]這個值存放的位置(位址)p+i是計算位置(位址)

c語言中指標p[i]和p++什麼區別

3樓:匿名使用者

你問的是啥?、

指標p[i],說明p是乙個陣列指標,指標p[i] 做p++,這是就變成指標p[i+1]另外指標。

若是像你所描述的,*p[i]和p++怎麼比較?根本不是乙個概念的東東,你要比較啥?

乙個說陣列指標,乙個是自加。。。

c語言中,指標*p[i]與p[i]有什麼卻別?分別代表什麼意思?

4樓:匿名使用者

若果我還沒記錯的話:

你的問題:你這裡問的是指標

p[i]:陣列p的[i]這個地方放的值

*p[i]:陣列p的[i]這個地方放的值(這當做乙個位址)的值,即p[i]這個地方放了乙個位址(相當於另外乙個p[i]),然後用*讀取他所代表的值。----即我所說的:

陣列p的[i]這個地方放的值(當做乙個位址)的值

5樓:某李某

*p[i]指的是裡面的值。

p[i]子的是位址,也就是裡面的值所在的位址。

c語言的指標問題。*(p+i)是代表取值呢還是取位址?

6樓:匿名使用者

定義int *p=a,那麼p+0就是

a[0]的首位址,

p+i就是a[i]的首位址,p+2就是a[2]的首位址,*(p+0)就是a[0][0]的地版址,*(p+1)就是a[1][0]的位址,*(p+2)就是a[2][0]的位址;而定義權int (*p)[4];代表p是乙個陣列指標,指向乙個4個 int大小的陣列,此時p=a之後,p就是乙個指向sizeof(int)*4這麼大小的空間了,*(p+0)就是a[0]行的位址了,*(p+1)就是a[1]行的位址了,所以*p和(*p)[4]不是同乙個指標,他們指向空間的的大小不一樣。

7樓:匿名使用者

首先,你應該明確指bai針dup的型別,是int *p 還是 int ** p,兩者都可zhi以指向陣列a的首位址dao。

如果你定義 int *p[4],這是版乙個指標陣列,權那麼p實際上是乙個常量。 *(p+i)與p[i]的意義一樣,是乙個指標,或者說是陣列p中的乙個元素。這個p與a看不出任何聯絡的。

8樓:匿名使用者

int *p=a

這是定自義指標,表示p是a[0][0]的位址,*(p+i)代表的是a[0][i]的值,

int (*p)[4]

定義乙個陣列指標,*(p+i)就是a[i][0]的位址,*(*(p+i)+j)是a[i][j]這個值

9樓:與子如初見

int *p,則p是一

個整形指復針,指向一制個整形變數的位址。

int (*p)[4],p是陣列指標,指向的是乙個含有四個整形元素的陣列的首位址。此時*(p+i)肯定是位址,因為p是陣列指標,p = a;,*(p+1)就相當於求出a[1]的首位址。

如果你不懂了你可以用**試一下,這樣的話印象就會深刻的。

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

10樓:金色潛鳥

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

11樓:向天致信

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

12樓:v5丶丶

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

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

13樓:匿名使用者

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

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

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

15樓:

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

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

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

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

c語言指標題目,C語言 指標題目

沒有區別,因為你的p本身的定義是int型指標,最後都會被強制轉換成int型指標。所以第二句p char 0x01 相當於p int char 0x01 舉個模擬的例子吧 doublep p double 5 p int 5 最後p只可能是double型,只不過後者的會多乙個隱式的轉換。我要來好好說道...

C語言指標建立函式問題,C語言指標呼叫函式問題,急求解釋(本題是《c和指標》上的題目)

第乙個表示傳遞graphadjlist型別的引用g,第二個表示傳遞graphadjlist型別的指標g 另外這是c 不是c。c語言指標呼叫函式問題,急求解釋 本題是 c和指標 上的題目 c語言指標作函式引數時的返回問題 首先,弄懂函式引數都是靠值傳遞。指標也是。進入函式後,函式建立幾個空間給形參,再...

C 指標的問題,C語言指標問題

這麼說吧,指標是以後資料結構的基礎,比如單鏈表,雙鏈表,二叉樹等等等等,全部都時指標做的,還有1720次對於現在的計算機來說,是個很小很小很小的數量級。指標學好了受益匪淺,並且也是程式設計今後必須的。指標的確是可以大大提高效率,但是要看你怎麼用,就和遞迴演算法一樣,另外,顯示位址是你語句的問題。比如...