指標和陣列名

2021-08-08 05:53:58 字數 1410 閱讀 3554

想要清楚的知道指標和陣列的本質區別還有處理方式,感覺繞不開看編譯器是如何處理的了,有時間可以上知乎搜搜有什麼編譯類的書籍,或者找個懂編譯的大神,在網上看到有一篇從編譯器角度剖析陣列名的,有所幫助,雖然沒有說到足夠深入讓我理解指標和陣列真正的本質是什麼:

本文只是稍微說明一下自己的猜測和理解,可能存在有錯的地方,主要還是覺得理解的不夠深刻,有時間希望看看編譯類的書籍。這個問題真的困擾我很久了,希望大神可以解釋。

指標和陣列名雖然用法上很多時候是一樣的,但其實是兩個東西,陣列更像是一種資料結構,但是可以轉化成指標型別

很多時候陣列名可以轉化成指標型別讓人不好理解,如下

char* argv;

char* *p=argv;

為什麼argv是char**型別的呢?

char* argv去分析, 第一步一定要去分析型別!分析型別很簡單,不是陣列就是指標!argv與結合是乙個陣列,然後儲存的資料型別是char*,所以可以確定argv是乙個指向char*型別的指標。

上面特地寫成了char* *p這種形式,就是想說明,p是乙個指標,指向了char*型別的資料(這就和陣列名一樣了)。

所以如何理解變數名的型別呢? 無論是多維陣列還是指標,只有進行第乙個結合*或者說明變數是陣列還是指標。

比如,對於三維四維指標,都可以這樣閱讀,比如說char****p,p是乙個指標,指向了char***,而不用讀成指標的指標的指標的指標…

而對於多維陣列,比如說int a[2][2],可以這麼理解,首先a[2]說明是乙個陣列,陣列中儲存的型別是int [2](編譯器把它處理成了儲存陣列的首位址),所以是乙個指向陣列的指標,即int(*)。

就像是double型別強轉成int型別一樣,乙個本來應該是int(*)型別的指標,轉化成了int**,如下

int a[2][3]=,};

int **p=(int**)a;

這個時候p的值和a的值是一模一樣的

cout

cout

<<*(p+1)cout

<<*(a+1)錯誤的用法,比如說想輸出a[1][2]

cout

<<*(*(p+1)+2)cout

<<*(*(a+1)+2)

指標和陣列名

在學習c語言指標時候,老師告訴我們,陣列名就是指標,指向陣列首元素的位址。有如下 int main int argc,const char argv printf arr p n arr printf arr 1 p n arr 1 printf lu n sizeof arr printf n p...

陣列名和陣列名取位址 指標陣列和陣列指標的區別

一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。分析 由執行結果可知,陣列名a和 a的記憶體位址相同,我們已經知道a a 0 所以有a 1指向陣列中下乙個元素 即為在首位址2751180基礎上加int的位元組數4...

陣列名和陣列名取位址 指標陣列和陣列指標的區別

一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。然而 a代表的不是取常量a的位址,而是取陣列的位址。雖然a和 a的記憶體位址相同,但是他們的意義不相同,前者僅代表陣列的首位址,後者代表整個陣列的,他的進價單位是整...