由sizeof()引出的對陣列名和指標的新認識
在C++中,陣列名和指標有很多類似的地方,甚至很多時候,陣列名與指標可以互相替換,我也一直以為兩者沒什麼值得注意的區別,直到看到了一道題,才發覺自己知識的匱乏。
void UpperCase(char str[]) // 將 str 中的小寫字母轉換成大寫字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字元長度為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str ); cout << str << endl;
上面這段程式碼中兩個sizeof的用法有問題嗎?
有!函式內的sizeof有問題。根據語法,sizeof(陣列名)可以測得陣列的容量,所以函式外的sizeof(str)等於6,沒問題。但是當陣列名作為函式引數進行傳遞的時候,就會退化成一個指標,所以函式體裡str是一個指標,而指標是4個位元組,因此sizeof(str)等於4。
可以看出,陣列名與指標還是有區別的,陣列名並不單純的是一個指標(陣列名和指標之間有一個不同之處,指標是一個變數,但陣列名不是變數)。這也是為什麼陣列名作為引數傳遞時,經常需要一個長度引數。
對於strlen來說,就沒有這麼多問題了,strlen本身就是一個函式(sizeof是操作符),strlen所作的僅僅是一個計數器的工作,它從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符'\0'為止,然後返回計數器值(長度不包含“\0”)。
如果還有疑問,可以參考http://www.cnblogs.com/wuzhenbo/archive/2012/05/29/2523777.html
相關文章
- 陣列和指標的問題陣列指標
- C語言中“陣列名”和“&陣列名”C語言陣列
- 深入探索 C/C++ 陣列與指標的奧祕之二:陣列名是一個指標常量嗎?C++陣列指標
- JavaScript中對陣列和陣列API的認識JavaScript陣列API
- 關於sizeof,對空指標sizeof(*p)可以嗎?指標
- C語言:陣列和指標的區別C語言陣列指標
- 二維陣列的指標的理解陣列指標
- 詳解c++指標的指標和指標的引用C++指標
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- C: (pointer) 陣列變數和指標的區別陣列變數指標
- C++ 指標陣列與陣列指標的區別C++指標陣列
- C/C++——指向函式的指標和指向函式的指標的陣列C++函式指標陣列
- js二維陣列新認識JS陣列
- Praat 學習日誌3--Praat的聲譜圖各項指標的認識指標
- 指標的申明和定義指標
- 徹底搞清C/C++中一維陣列,二維陣列,指標,陣列指標和指標陣列以及指向指標的指標,行地址和列地址之間的關係C++陣列指標
- 【資料質量】--認知指標的層次指標
- 指標常量和常量指標的區別指標
- 各種語言中對指標的叫法指標
- 關於指標傳遞和指標的指標指標
- 關於二維陣列指標的問題陣列指標
- 具體的知識 && 知識在專案中的應用(以指標和記憶體的知識引出)指標記憶體
- 淺議C語言中靈魂陣列和指標的互操作(轉)C語言陣列指標
- 對js中this指標的一些研究JS指標
- 指向指標的指標指標
- 指標的理解指標
- 指標的用法指標
- 由顯示/隱藏引出的CSSbug(轉)CSS
- 由顯示/隱藏引出的CSS Bug(轉)CSS
- 對vue原始碼的初步認識和理解Vue原始碼
- 指標問題的一點體會(區別 [指向指標的指標] 與 [指標的指標] .) (轉)指標
- 由Java中的Set,List,Map引出的排序技巧Java排序
- 陣列指標和指標陣列陣列指標
- 【C++系列】指標物件和物件指標的區別C++指標物件
- 空指標的救星指標
- 深入探索 C/C++ 陣列與指標的奧祕之一:陣列與指標概念剖析C++陣列指標
- sizeof 和 strlen 計算陣列大小和長度詳解陣列
- 陣列去重Demo引出的思考陣列