97超级碰碰碰久久久_精品成年人在线观看_精品国内女人视频免费观_福利一区二区久久

電腦中的sizeof函數(shù)

  • 相關推薦

電腦中的sizeof函數(shù)

  sizeof函數(shù)

  1,是什么?

電腦中的sizeof函數(shù)

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

  2,有什么用?

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

  3,怎么用?

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

  4,用的時候要注意什么?

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

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

 。3)sizeof返回的數(shù)據(jù)類型是unsigned int。因為C中不同類型數(shù)據(jù)混合運算時的自動轉(zhuǎn)換,有時候不注意的話可能會出問題,具體可以參照下面的程序例子。

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

  5,實例分析

  源碼:

  #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

  結果分析:

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

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

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

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

  6總結

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

  strlen()函數(shù)

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

  聲明

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

  size_t strlen(const char *str)

  參數(shù)

  str -- 這是字符串的長度要計算的。

  返回值

  這個函數(shù)返回字符串的長度。

  例子

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

  #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的用法區(qū)別

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

  2. sizeof是運算符(C++ 關鍵字),strlen是函數(shù)。

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

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

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

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

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

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

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

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

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

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

  都等價于 fun(char *)。

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

  進入函數(shù)后用memcpy拷貝出來,長度由另一個形參傳進去

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

  sizeof對指針的話,結果是相應的類型:

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

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

【電腦中的sizeof函數(shù)】相關文章:

電腦中木馬不能開機09-05

js函數(shù)遞歸問題?07-09

初中函數(shù)教學反思07-06

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

年假函數(shù)計算方式07-11

函數(shù)的歷史來源簡介08-04

初中數(shù)學余弦函數(shù)公式12-02

如何用excel函數(shù)計算年假?07-10

工齡工資如何用函數(shù)計算07-12

求excel中年假的計算函數(shù)07-11