電腦中的sizeof函數

時(shí)間:2022-07-02 19:25:35 計算機/互聯(lián)網(wǎng)/通信 我要投稿
  • 相關(guān)推薦

電腦中的sizeof函數

  sizeof函數

  1,是什么?

電腦中的sizeof函數

  sizeof其實(shí)就是一個(gè)運算符,和那些+,-一樣的東西,在程序編譯的時(shí)候進(jìn)行解析轉換。雖然我們經(jīng)常見(jiàn)到sizeof后面跟著(zhù)個(gè)小括號,長(cháng)得和函數差不多,但它和函數完全是兩碼事。

  2,有什么用?

  sizeof其實(shí)就是用于告訴我們編譯器在為某一特定數據或者某種數據類(lèi)型的數據在存儲空間中開(kāi)辟空間時(shí),開(kāi)辟的空間大小,以字節為單位。

  3,怎么用?

  sizeof(類(lèi)型),或者sizeof(變量)都可以,得到的就是類(lèi)型或者變量的存儲空間。當對變量用的時(shí)候,也可以沒(méi)有括號,直接 sizeof 變量,但一般不用(我一般都是只記一種通用的用法……)。

  4,用的時(shí)候要注意什么?

 。1)sizeof返回的占用空間大小是為這個(gè)變量開(kāi)辟的大小,而不只是它用到的空間。和現今住房的建筑面積和實(shí)用面積的概念差不多。所以對結構體用的時(shí)候,大多情況下就得考慮字節對齊的問(wèn)題了。

 。2)對位域成員等連編譯器都無(wú)法確定存儲空間的東西不能用。這個(gè)應該比較好理解,因為sizeof返回的都是以字節為單位的數據,你讓它去求那些以位為單位的大小,這不是存心難為編譯器嘛。所以編譯器采用的方案是統一不受理,即使你說(shuō)你剛好是8位,占一個(gè)字節,編譯器也不理你。

 。3)sizeof返回的數據類(lèi)型是unsigned int。因為C中不同類(lèi)型數據混合運算時(shí)的自動(dòng)轉換,有時(shí)候不注意的話(huà)可能會(huì )出問(wèn)題,具體可以參照下面的程序例子。

 。4)要注意數組名和指針變量的區別。通常情況下,我們總覺(jué)得數組名和指針變量差不多,但是在用sizeof的時(shí)候差別很大,對數組名用sizeof返回的是整個(gè)數組的大小,而對指針變量進(jìn)行操作的時(shí)候返回的則是指針變量本身所占得空間,在32位機的條件下一般都是4。而且當數組名作為函數參數時(shí),在函數內部,形參也就是個(gè)指針,所以不再返回數組的大小。

  5,實(shí)例分析

  源碼:

  #includeint main(){ int iVal = 3; printf("The size of type int is %d n", sizeof(int)); printf("The size of iVal is %dn", sizeof(iVal)); printf("The size of iVal is %dn", sizeof iVal); if((iVal - sizeof(int)) < 0) { printf("The return type is intn"); } else { printf("The return type is unsigned intn"); } char chArrayCon[7]; char *chp; chp = chArrayCon; printf("The size of chArrayCon is %d, The size of chp is %dn", sizeof(chArrayCon), sizeof(chp)); int iArraySize = 3; char chArrayVar[iArraySize]; printf("The size of chArrayVar is %dn", sizeof(chArrayVar)); return 0;}

  運行結果:

  The size of type int is 4 The size of iVal is 4The size of iVal is 4The return type is unsigned intThe size of chArrayCon is 7, The size of chp is 4The size of chArrayVar is 3

  結果分析:

  代碼第一部分主要就是簡(jiǎn)單的表示了一下用法。

  第二部分說(shuō)明了注意事項的第三項。按說(shuō),iVal的值是3,減4的話(huà)應該是-1,小于0,輸出的應該是"he return type is int"。但是由于當int和unsigned int一起運算時(shí),會(huì )默認變成unsigned int,所以結果會(huì )是一個(gè)很大的unsigned int類(lèi)型的數,是大于0的。

  代碼第三部分就簡(jiǎn)單說(shuō)明了數組名和指針變量的區別,即使你把指針變量指向數組名,編譯器依然能夠分辨出區別。

  以上講述的都沒(méi)有考慮在C99標準下的情況。因為在C99標準下有種特殊情況,那就是不定長(cháng)數組的使用。當對不定長(cháng)數組名使用sizeof的話(huà),返回的也是整個(gè)數組的大小,就像實(shí)例中第四塊代碼一樣。但是這并不是在編譯階段執行的,而是在程序運行階段執行的。因為在編譯的時(shí)候,編譯器一般不知道變量的值是多少。(當然例子中我直接賦值3,可能不方便理解,可以假想iArraySize是通過(guò)scanf來(lái)獲得實(shí)際數值的,然后再聲明數組的)。對于這種情況,實(shí)際中應用的并不多,大家可以當做特殊情況對待即可,或者直接忽略掉也行……

  6總結

  其實(shí)sizeof的作用就是告訴我們分配給變量的“建筑面積”的.大小,只要記得這一點(diǎn)應該就夠了,不管這個(gè)變量類(lèi)型是普通的整型數據,還是結構體,共用體,枚舉……記住這一點(diǎn)后,當我們再去想知道sizeof對不同數據類(lèi)型操作返回的值到底是什么的時(shí)候,只需搞明白那些數據類(lèi)型到底要消耗多少“建筑面積”就可以啦!

  strlen()函數

  C庫函數 size_t strlen(const char *str) 計算字符串str的長(cháng)度,但不包括終止空字符。

  聲明

  以下是聲明的strlen() 函數。

  size_t strlen(const char *str)

  參數

  str -- 這是字符串的長(cháng)度要計算的。

  返回值

  這個(gè)函數返回字符串的長(cháng)度。

  例子

  下面的例子顯示使用strlen() 函數。

  #include#includeint main (){ char str[50]; int len; strcpy(str, "This is yiibai.com"); len = strlen(str); printf("Length of |%s| is |%d|", str, len); return(0);}

  讓我們編譯和運行上面的程序,這將產(chǎn)生以下結果:

  Length of |This is yiibai.com| is |26|

  sizeof與strlen的用法區別

  1. sizeof操作符的結果類(lèi)型是size_t,它在頭文件中typedef為unsigned int類(lèi)型。該類(lèi)型保證能容納實(shí)現所建立的最大對象的字節大小。

  2. sizeof是運算符(C++ 關(guān)鍵字),strlen是函數。

  3. sizeof可以用類(lèi)型做參數,strlen只能用char*做參數,且必須是以””結尾的。sizeof還可以用函數做參數,比如:

  short f();printf("%dn", sizeof(f()));

  輸出的結果是返回值的類(lèi)型的大小, 即sizeof(short)=2。

  4. 數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。大部分編譯程序在編譯的時(shí)候就把sizeof計算過(guò)了,是類(lèi)型或是變量的長(cháng)度,這就是sizeof(x)可以用來(lái)定義數組維數的原因。

  char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //b=20;

  而strlen的結果要在運行的時(shí)候才能計算出來(lái),是用來(lái)計算字符串的長(cháng)度,不是類(lèi)型占內存的大小。

  5. sizeof后如果是類(lèi)型必須加括弧,如果是變量名可以不加括弧。這是因為sizeof是個(gè)操作符不是個(gè)函數。

  6. 當適用了于一個(gè)結構類(lèi)型時(shí)或變量, sizeof 返回實(shí)際的大小,當適用一靜態(tài)地空間數組, sizeof 得到全部數組的尺寸。sizeof 操作符不能返回動(dòng)態(tài)地被分派了的數組或外部的數組的尺寸。

  7. 數組作為參數傳給函數時(shí)傳的是指針而不是數組,傳遞的是數組的首地址,如:

  fun(char [8])fun(char [])

  都等價(jià)于 fun(char *)。

  在C++里參數傳遞數組永遠都是傳遞指向數組首元素的指針,編譯器不知道數組的大小。如果想在函數內知道數組的大小, 需要這樣做:

  進(jìn)入函數后用memcpy拷貝出來(lái),長(cháng)度由另一個(gè)形參傳進(jìn)去

  fun(unsiged char *p1, int len){ unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len);}

  sizeof對指針的話(huà),結果是相應的類(lèi)型:

  char* ss = "0123456789";sizeof(ss)

  結果是4 => ss是指向字符串常量的字符指針,sizeof 獲得的是一個(gè)指針的之所占的空間,應該是長(cháng)整型的,所以是4. sizeof(*ss) 結果 1, => *ss是第一個(gè)字符,其實(shí)就是獲得了字符串的第一位“0” 所占的內存空間,是char類(lèi)型的,占了1個(gè)字節,strlen(ss)= 10 >>>> 如果要獲得這個(gè)字符串的長(cháng)度,則一定要使用 strlen.

【電腦中的sizeof函數】相關(guān)文章:

電腦中木馬不能開(kāi)機09-05

js函數遞歸問(wèn)題?07-09

初中函數教學(xué)反思07-06

對數函數的性質(zhì)07-09

年假函數計算方式07-11

函數的歷史來(lái)源簡(jiǎn)介08-04

初中數學(xué)余弦函數公式12-02

如何用excel函數計算年假?07-10

工齡工資如何用函數計算07-12

求excel中年假的計算函數07-11

99久久精品免费看国产一区二区三区|baoyu135国产精品t|40分钟97精品国产最大网站|久久综合丝袜日本网|欧美videosdesexo肥婆