陣列名與指標

2021-08-25 02:22:33 字數 1467 閱讀 8159

在本科畢業前,一直以為陣列名就是指標,但是最近看了一些技術文章和與一些技術大佬的討論,我開始迷茫了,在心裡一直有疑問,在本科寫程式的時候一直就拿陣列名當指標用啊,沒什麼問題啊,但是後來想了想,有了點靈感,就寫下來,不知道自己琢磨的是否通透,歡迎交流學習。

首先說明陣列名為什麼不是指標:上例子:

#include using namespace std;

int main()

結果:

這個例子就可以70%讓我認為陣列名不是指標(我當時所想,為什麼是70%,我想的是也許是sizeof內部實現造成的呢,看到指標就輸出4,看到指標是陣列就輸出陣列的長度),但我又一想,沒必要這樣吧,完全可以用另乙個函式輸出陣列長度,再找證據。

#include using std::cout;

using std::endl;

int main()

這個例子有說明陣列名可以做指標,但是他是指標常量,為什麼:下面的程式成立嗎?

1. int intarray[10];

2. intarray++;

所以總結一下:

(1)陣列名的內涵在於其指代實體是一種資料結構,這種資料結構就是陣列;

(2)陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是乙個指標常量;

(3)指向陣列的指標則是另外一種變數型別(在win32平台下,長度為4),僅僅意味著陣列的存放位址!

解釋下(1)通過第乙個例子可以看出陣列名確實指代的一種資料結構,所以兩種sizeof輸出的回不一樣,(2)

通過第二個例子可以說明陣列名可以作為常量指標,為什麼是常量指標?下面是我的思考:

之所以可以作為常量指標是因為要控制陣列在記憶體中的位置,比如陣列int a[10], a如果作為變數指標的話,「a+1」就會使整個陣列向後移動,導致最後一位訪問出問題,也就是現在的a[0],就是當初a[1]的位置,這是乙個思考。

(3)指標就是一種變數,用來存放位址,指向那,存放哪的位址。

總結就是:陣列名不是指標,但是可以外延成指標,但是這就又帶來了新一輪的思考,陣列名這個結構是怎麼設計的,他怎麼攜帶的資訊?讓他指代一種資料結構,然後外延有可以看做一種指標來用?

更新~~~~~~~~~~~~~~~~~~~~~~~~~~~我是分割線~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

思考了一會覺得又有了新的感悟:

陣列名指代的是一種資料結構,說白了就是一段連續記憶體的位址,就和int,double一樣,他之所以是常量指標,上面已經分析,我自己所想:其實陣列名就是那一段記憶體的開頭位址(const的),所以sizeof(陣列名),就像sizeof(int)一樣輸出占用記憶體大小,而指標變數是指向那段位址的,所以就可以變了,sizeof(指標)就是4(32位);所以陣列名也是位址所以可以延伸為指標使用。

陣列名與指標

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

陣列名與指標

注意使用上的區別 陣列名相當於指標常量。指標則根據宣告可以為指標變數。也就是說,指標變數的值可以改變,陣列名指向位址不可能改變。注意執行時的區別 char p hello world char a hello world 這兩句話執行效果看上去差不多,但執行方式則有很大區別 p本身佔據4位元組的記憶...