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...