陣列名與指標2

2021-08-14 08:37:12 字數 1423 閱讀 8963

指標與陣列名2

1,方括號運算子[ ]。

在定義陣列的時候就不說了,就是開闢一片連續的空間,陣列名是首位址,是常量。

在呼叫陣列元素時用的是方括號,例如int a[5]; a[1]=2; 在a[1]=2;這個語句的實質是*(a+1)=2; 所以方括號的作用是將前面的和括起來的相加再做間訪(間接訪問)操作,因此a[1]=2;等價與1[a]=2;不過不建議用後者。知道了方括號的實質,我們就比較容易理解int a[5];int p=a; p[1]=2;了p是指標,因為p[1]=2;與(p+1)=2;等價,所以把指標當陣列名這樣用是可以的。不過像int a;int *p=&a; p[1]=2;雖然也能夠訪問到a的後面幾個記憶體空間,但是這些空間並沒有分配給這個程式 ,所以這是非法操作,也就是指標越界了。

2,陣列名。

我們常常說陣列名是位址常量或者說是指標常量。首先陣列名肯定不是變數,程式沒有專門為這個識別符號專門開闢空間,我們也無法給陣列名賦值,這都說明陣列名不是變數。但陣列名具有普通常量不具有的性質,我們無法給普通常量取位址,printf("%p",&1);是錯誤的,int a[5];printf("%p",&a);卻是正確的。即使我們給普通常量轉換型別& (int *)1,&(int *[5])1,&(int *)0x1234abcd都是錯誤的。其實我們可以聯想到const限制定義的那種"常量",const int a=1;a是常量,但是接著int m[a];在一些編譯器會報錯,這說明a不同於普通常量。

3,指標資料型別

指標不管是什麼型別,它總只佔4位元組,所以指標的型別是做什麼的呢?指標的型別是說明這個指標指向多少空間,通俗的說就是這個指標管多大的一片空間,指標變數存放的資料就是這連續一片空間的首位址。char *管1位元組,int *管4(32位)位元組,這樣可以得出int *[5]管20位元組,因此int a[5][5];int (*p)[5]=a;p+1存的位址比p存的位址正好大20。所以我們可以這樣說,int *指向int型變數,int *[n]指向長度為n的int型一維陣列。

4:綜合

int a[5][5];a的型別是int *[5],a[0]的型別是int *,a和a[0]的值都是陣列首位址,但它們資料型別不同。&a[0]得到的是a,嚴格的說這裡&不能稱之為取位址,因為a[0]作為乙個常量沒有自己的儲存空間 ,也就沒有這個空間位址的說法,&給陣列名取位址更像是一種資料型別的公升級,int *公升級成int *[n],而值不變。相印給陣列指標間訪就像型別降級,值不變型別變。經過測試發現int a[3][5];a[0]的型別是int *,a和&a[0]的型別是int *[5],還可以繼續公升級,&a的型別是int *[3][5],不過再不能公升級了,因為這個陣列沒有第三維。

在函式引數傳遞陣列其實就是傳遞指標,傳遞一維陣列void aa(int p);方括號裡不需要加陣列大小就是因為p是int *型指標變數,不需要什麼陣列。傳遞二維陣列時,void aa(int p[m][n]);中不需要m,p[n]就可以因為p是int *[n]型指標變數,與m無關。

陣列名與指標

引言 指標是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...