注意使用上的區別:
陣列名相當於指標常量。指標則根據宣告可以為指標變數。也就是說,指標變數的值可以改變,陣列名指向位址不可能改變。
注意執行時的區別:
char *p="hello world"; char a="hello world"; 這兩句話執行效果看上去差不多,但執行方式則有很大區別:p本身佔據4位元組的記憶體空間,它指向字串常量hello world的首位址,這個常量在記憶體中儲存占用了12位元組,即「hello world\0」就是h的儲存位址;a本身不佔據空間,陣列a[12]佔據12位元組空間(與字串常量hello world同。
注意:計算:sizeof p = 4; sizeof a = 12*1 = 12<<0 = 12;
注意:p[4]=o, a[4]=o;但訪問方式不同,p[4]訪問方式:先從p的儲存空間中取出儲存的值,該值加4作為位址去取出儲存的值為'o'; a[4]訪問方式:a代表的位址加4作為新位址,取出該位址儲存的值'o'。
注意:函式中把陣列名作為指標傳遞,因此即使在實參中傳入a,在函式中的sizeof a也等於4,而非陣列長度乘以陣列型別位元組數。
等同的情況:
表示式中,函式引數中的陣列名都被轉化成指標。
所以對於int a[10], *p=a; p[2]和a[2]訪問到的值是相同的(注意執行方式不同);
對於void func(int *p),呼叫時可以用func(a);
另外對於陣列:
a[6]等價於6[a],雖然6[a]的寫法比較晦澀,但合法,都表示將a作為指標加6後引用該位址內儲存的值。
編譯器自動把下標值乘以型別位元組數以得到正確的步長。由於c變數佔據空間分別為1,2,4,8,均為2的n次方,因此該乘法使用左移運算實現。
處理一維陣列時,指標並不見得比陣列更快。
例項:下面的程式展示了陣列名作為實參傳入函式的情況,請注意,函式引數只能是變數,因為實參要給它賦值!
#include
void pandstr(char str)
int main(void)
執行結果如下:
[quote]
str: hello!, sizeof str=4, strlen(str)=6
str:other hello!, sizeof str=4, strlen(str)=12
[/quote]
陣列名與指標
引言 指標是c c 語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 很幸運,我的大學老師就是其中之一。時至今日,我日復一日地進行著c c 專案的開發,而身邊...
陣列名與指標
include using namespace std int main int b 2 10 陣列名本身就是指標,再加上 就變成了雙指標,這裡的雙指標的就是指二維陣列 int p int a 1 p指向a陣列的第6個元素 雖然不存在 cout p 1 cout b 1 cout b 0 retur...
陣列名與指標
在本科畢業前,一直以為陣列名就是指標,但是最近看了一些技術文章和與一些技術大佬的討論,我開始迷茫了,在心裡一直有疑問,在本科寫程式的時候一直就拿陣列名當指標用啊,沒什麼問題啊,但是後來想了想,有了點靈感,就寫下來,不知道自己琢磨的是否通透,歡迎交流學習。首先說明陣列名為什麼不是指標 上例子 incl...