指標和陣列名的區別

2021-05-23 11:32:29 字數 2216 閱讀 7283

c/c++應該是大學裡最先接觸的程式語言,它們的重要性不言而喻。但是我始終抱著「陣列名就是指標」的錯誤信條到現在,可能是因為大學老師錯誤的講解使我一直保留著這種誤解。指標是c/c++語言的特色,而陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用,所以也難免在學習中將兩者混淆。這裡介紹下指標和陣列名的區別:

1.指標和陣列名佔據的記憶體空間大小不一樣,如下程式1:

char

str[10]

;char

*pstr

=str

;cout<

;<

sizeof

(str

)>&

lt;<

endl

;>

cout<

;<

sizeof

(pstr

);>

sizeof

(pstr

);>

第一行輸出結果是:

10,第二行輸出結果是:

4endl

;>

sizeof

(str

)>

從這裡我們可以看出:陣列名對應著(而不是指向)一塊記憶體(陣列所佔的記憶體區域)或者說是指代陣列這種資料結構,其位址與容量在生命期內保持不變,只有陣列的內容可以改變。指標對應著乙個佔據4個位元組(win32)的記憶體區域,而指向這4個位元組所儲存的位址所對應的記憶體單元,它可以指向任意型別的記憶體塊。因此,sizeof(str)值為陣列佔據的記憶體空間大小即10個位元組,而sizeof(pstr)值為指標的值佔據的記憶體空間大小即4個位元組。

2.陣列名不是指標,但是在一定的情況下轉換為指代陣列的首位址的指標,而這個陣列名轉為的指標只能是指標常量。

在以下兩種情況下才能進行這種轉換:

a.在程式1第二行**中,將陣列名直接賦值給指標,此時陣列名轉換為指向陣列的首單元的常量指標。

b.直接將陣列名作為指標形參的時候,陣列名則轉換為指向陣列的首單元的常量指標進行傳遞,如下程式2:

void

fun(

char

str)

void

main

()endl

;>

注意:陣列名作為函式形參進行傳遞時,在子函式體內,它已經不再是乙個指標常量,而是變成乙個真正的指標,可以進行增減等操作,可以被修改。所以程式

2中子程式第一條語句輸出的

sizeof

(str

)的值為4.

sizeof

(str

)>

既然陣列名可以被看作指標常量,而常量是不能修改的,那麼如下**是不允許的:

char

str[10]

;str

++;

但如下**則合法的:

char

str[10]

;char

*pstr

=str

;pstr

++;

3.使用指標訪問陣列和使用陣列名訪問陣列本質不同。

例如:char

str[7]

="ksarea";

char

*pstr

=str

;cout<

;<

str[3]

>&

lt;<

endl

><

<

pstr[3

];>

pstr[3

];>

endl

>

其中str[3

]和pstr[3

]返回的都是字元'

r',但是編譯器產生的執行**卻不一樣。對於

str[3]

,執行**是從

str開始,向後移動兩個位元組,然後取出其中的字元;而對於

pstr[3

],執行**是從

pstr

中取出位址,然後在其上加

3,然後取出對應記憶體中的字元。當然,如果

pstr

是指向int

型的指標,那麼

pstr[3

]的處理過程是從

pstr

中取出位址,然後在其上加上3*

sizeof

(int

),最後取出對應記憶體中的字元,其他的資料型別一次類推。<

spanid=

"more-73

">

span

>

str[3]

>

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

首先指標陣列 和陣列指標叫法本身是種誤導 指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointerto an array,即指向陣列的指標 其次他們本質乙個是陣列,乙個是指標 int a 4 表示是乙個陣列 陣列a中的元素都為int型指...

指標和陣列名

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

指標和陣列名

在學習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...