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...