天天看點

由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

繼續閱讀