實(shí)際情況是:第6行輸出10,,第7行輸出4;
先給出三個(gè)結(jié)論:
1,、數(shù)組名指代一種數(shù)據(jù)結(jié)構(gòu):數(shù)組
第2行的輸出結(jié)果為40(整型數(shù)組占據(jù)的內(nèi)存空間大小),。
2,、數(shù)組名可作為指針常量
下面的程序成立嗎,?
讀者可以編譯之,,發(fā)現(xiàn)編譯出錯(cuò)。原因在于,,雖然數(shù)組名可以轉(zhuǎn)換為指向其指代實(shí)體的指針,,但是它只能被看作一個(gè)指針常量,,不能被修改。
而指針,,不管是指向結(jié)構(gòu)體、數(shù)組還是基本數(shù)據(jù)類(lèi)型的指針,,都不包含原始數(shù)據(jù)結(jié)構(gòu)的內(nèi)涵,,在WIN32平臺(tái)下,sizeof操作的結(jié)果都是4,。
3,、數(shù)據(jù)名可能失去其數(shù)據(jù)結(jié)構(gòu)內(nèi)涵 到這里似乎數(shù)組名魔幻問(wèn)題已經(jīng)宣告圓滿解決,,但是平靜的湖面上卻再次掀起波浪。請(qǐng)看下面一段程序: C++代碼
[c++] view plaincopy
一,、sizeof的概念
sizeof是C語(yǔ)言的一種單目操作符,如C語(yǔ)言的其他操作符++,、--等,。它并不是函數(shù)。sizeof操作符以字節(jié)形式給出了其操作數(shù)的存儲(chǔ)大小,。操作數(shù)可以是一個(gè)表達(dá)式或括在括號(hào)內(nèi)的類(lèi)型名,。操作數(shù)的存儲(chǔ)大小由操作數(shù)的類(lèi)型決定。
二,、sizeof的使用方法
1,、用于數(shù)據(jù)類(lèi)型
sizeof使用形式:sizeof(type)
數(shù)據(jù)類(lèi)型必須用括號(hào)括住
。如sizeof(int),?!?
2、用于變量
sizeof使用形式:sizeof(var_name)或sizeof var_name
變量名可以不用括號(hào)括住,。如sizeof (var_name),,sizeof var_name等都是正確形式。帶括號(hào)的用法更普遍,,大多數(shù)程序員采用這種形式,。
三,。sizeof用法總結(jié)
在VC中,,sizeof有著許多的用法,而且很容易引起一些錯(cuò)誤,。下面根據(jù)sizeof后面的參數(shù)對(duì)sizeof的用法做個(gè)總結(jié),。
A. 參數(shù)為數(shù)據(jù)類(lèi)型或者為一般變量。例如sizeof(int),sizeof(long)等等,。這種情況要注意的是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的
,。例如int類(lèi)型在16位系統(tǒng)中占2個(gè)字節(jié),在32位系統(tǒng)中占4個(gè)字節(jié),。
B. 參數(shù)為數(shù)組或指針,。下面舉例說(shuō)明.
int a[50]; //sizeof(a)=4*50=200; 求數(shù)組所占的空間大小
#int* a= “hello world”,應(yīng)該是12(要注意)
int *a=new int[50];// sizeof(a)=4; a為一個(gè)指針,,sizeof(a)是求指針
//的大小,在32位系統(tǒng)中,,當(dāng)然是占4個(gè)字節(jié)。
C. 參數(shù)為結(jié)構(gòu)或類(lèi),。Sizeof應(yīng)用在類(lèi)和結(jié)構(gòu)的處理情況是相同的,。但有兩點(diǎn)需要注意,,第一、結(jié)構(gòu)或者類(lèi)中的靜態(tài)成員不對(duì)結(jié)構(gòu)或者類(lèi)的大小產(chǎn)生影響,,因?yàn)殪o態(tài)變量的存儲(chǔ)位置與結(jié)構(gòu)或者類(lèi)的實(shí)例地址無(wú)關(guān)
,。
第二、沒(méi)有成員變量的結(jié)構(gòu)或類(lèi)的大小為1,,因?yàn)楸仨毐WC結(jié)構(gòu)或類(lèi)的每一 個(gè)實(shí)例在內(nèi)存中都有唯一的地址,。
下面舉例說(shuō)明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個(gè)指針,。
Class test1{ };//sizeof(test1)=1;
D. 參數(shù)為其他。下面舉例說(shuō)明,。
int func(char s[5]);
{
cout<<sizeof(s)<<endl;
//數(shù)的參數(shù)在傳遞的時(shí)候系統(tǒng)處理為一個(gè)指針,,所
//以sizeof(s)實(shí)際上為求指針的大小。
return 1;
}
sizeof(func(“1234”))=4//因?yàn)閒unc的返回類(lèi)型為int,,所以相當(dāng)于
//求sizeof(int). 還要注意的是“1234”而不是“12345”)
以上為sizeof的基本用法,,在實(shí)際的使用中要注意分析VC的分配變量的分配策略,這樣的話可以避免一些錯(cuò)誤,。
示例
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計(jì)算字符串的長(zhǎng)度,,以結(jié)束符 0x00 為字符串結(jié)束。
int b=sizeof(str); //而b=20; >>>> sizeof 計(jì)算的則是分配的數(shù)組 str[20] 所占的內(nèi)存空間的大小,,不受里面存儲(chǔ)的內(nèi)容改變,。
上面是對(duì)靜態(tài)數(shù)組處理的結(jié)果,如果是對(duì)指針,,結(jié)果就不一樣了
char* ss = "0123456789";
sizeof(ss) 結(jié)果 4 ===》ss是指向字符串常量的字符指針,,sizeof 獲得的是一個(gè)指針的之所占的空間,
應(yīng)該是長(zhǎng)整型的
,所以是4
sizeof(*ss) 結(jié)果 1 ===》*ss是第一個(gè)字符 其實(shí)就是獲得了字符串的第一位'0' 所占的內(nèi)存空間,,
是char類(lèi)型的,,
占了 1 位
|
|
來(lái)自: 鍵盤(pán)農(nóng)夫 > 《C》