最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Sizeof與Strlen的區(qū)別以及聯(lián)系的使用詳解

 更新時(shí)間:2013年05月06日 11:46:23   作者:  
本篇文章是對(duì)Sizeof與Strlen的區(qū)別以及聯(lián)系的使用進(jìn)行了詳細(xì)的介紹。需要的朋友參考下

一、sizeof
    sizeof(...)是運(yùn)算符,在頭文件中typedef為unsigned int,其值在編譯時(shí)即計(jì)算好了,參數(shù)可以是數(shù)組、指針、類型、對(duì)象、函數(shù)等。
    它的功能是:獲得保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。
    由于在編譯時(shí)計(jì)算,因此sizeof不能用來(lái)返回動(dòng)態(tài)分配的內(nèi)存空間的大小。實(shí)際上,用sizeof來(lái)返回類型以及靜態(tài)分配的對(duì)象、結(jié)構(gòu)或數(shù)組所占的空間,返回值跟對(duì)象、結(jié)構(gòu)、數(shù)組所存儲(chǔ)的內(nèi)容沒(méi)有關(guān)系。
    具體而言,當(dāng)參數(shù)分別如下時(shí),sizeof返回的值表示的含義如下:
    數(shù)組——編譯時(shí)分配的數(shù)組空間大小;
    指針——存儲(chǔ)該指針?biāo)玫目臻g大?。ù鎯?chǔ)該指針的地址的長(zhǎng)度,是長(zhǎng)整型,應(yīng)該為4);
    類型——該類型所占的空間大?。?BR>    對(duì)象——對(duì)象的實(shí)際占用空間大??;
    函數(shù)——函數(shù)的返回類型所占的空間大小。函數(shù)的返回類型不能是void。
**************

二、strlen
    strlen(...)是函數(shù),要在運(yùn)行時(shí)才能計(jì)算。參數(shù)必須是字符型指針(char*)。當(dāng)數(shù)組名作為參數(shù)傳入時(shí),實(shí)際上數(shù)組就退化成指針了。
    它的功能是:返回字符串的長(zhǎng)度。該字符串可能是自己定義的,也可能是內(nèi)存中隨機(jī)的,該函數(shù)實(shí)際完成的功能是從代表該字符串的第一個(gè)地址開(kāi)始遍歷,直到遇到結(jié)束符NULL。返回的長(zhǎng)度大小不包括NULL。
*****************

三、舉例:
    eg1、char arr[10] = "What?";
              int len_one = strlen(arr);
              int len_two = sizeof(arr);
              cout << len_one << " and " << len_two << endl;
    輸出結(jié)果為:5 and 10
    點(diǎn)評(píng):sizeof返回定義arr數(shù)組時(shí),編譯器為其分配的數(shù)組空間大小,不關(guān)心里面存了多少數(shù)據(jù)。strlen只關(guān)心存儲(chǔ)的數(shù)據(jù)內(nèi)容,不關(guān)心空間的大小和類型。

    eg2、char * parr = new char[10];
              int len_one = strlen(parr);
              int len_two = sizeof(parr);
              int len_three = sizeof(*parr);
              cout << len_one << " and " << len_two << " and " << len_three << endl;
    輸出結(jié)果:23 and 4 and 1
    點(diǎn)評(píng):第一個(gè)輸出結(jié)果23實(shí)際上每次運(yùn)行可能不一樣,這取決于parr里面存了什么(從parr[0]開(kāi)始知道遇到第一個(gè)NULL結(jié)束);第二個(gè)結(jié)果實(shí)際上本意是想計(jì)算parr所指向的動(dòng)態(tài)內(nèi)存空間的大小,但是事與愿違,sizeof認(rèn)為parr是個(gè)字符指針,因此返回的是該指針?biāo)嫉目臻g(指針的存儲(chǔ)用的是長(zhǎng)整型,所以為4);第三個(gè)結(jié)果,由于*parr所代表的是parr所指的地址空間存放的字符,所以長(zhǎng)度為1。
************

四、參考資料:
Sizeof與Strlen的區(qū)別與聯(lián)系(轉(zhuǎn))

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

2.sizeof是算符,strlen是函數(shù)。

3.sizeof可以用類型做參數(shù),strlen只能用char*做參數(shù),且必須是以''\0''結(jié)尾的。
sizeof還可以用函數(shù)做參數(shù),比如:
short f();
printf("%d\n", sizeof(f()));
輸出的結(jié)果是sizeof(short),即2。

4.數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針了。

5.大部分編譯程序 在編譯的時(shí)候就把sizeof計(jì)算過(guò)了 是類型或是變量的長(zhǎng)度這就是sizeof(x)可以用來(lái)定義數(shù)組維數(shù)的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

6.strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來(lái),時(shí)用來(lái)計(jì)算字符串的長(zhǎng)度,不是類型占內(nèi)存的大小。

7.sizeof后如果是類型必須加括弧,如果是變量名可以不加括弧。這是因?yàn)閟izeof是個(gè)操作符不是個(gè)函數(shù)。

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

9.數(shù)組作為參數(shù)傳給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組的首地址,
如:
fun(char [8])
fun(char [])
都等價(jià)于 fun(char *)
在C++里參數(shù)傳遞數(shù)組永遠(yuǎn)都是傳遞指向數(shù)組首元素的指針,編譯器不知道數(shù)組的大小
如果想在函數(shù)內(nèi)知道數(shù)組的大小, 需要這樣做:
進(jìn)入函數(shù)后用memcpy拷貝出來(lái),長(zhǎng)度由另一個(gè)形參傳進(jìn)去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}

我們能常在用到 sizeof 和 strlen 的時(shí)候,通常是計(jì)算字符串?dāng)?shù)組的長(zhǎng)度
看了上面的詳細(xì)解釋,發(fā)現(xiàn)兩者的使用還是有區(qū)別的,從這個(gè)例子可以看得很清楚:

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類

型的,占了 1 位

strlen(ss)= 10 >>>> 如果要獲得這個(gè)字符串的長(zhǎng)度,則一定要使用 strlen

相關(guān)文章

  • C語(yǔ)言結(jié)構(gòu)體嵌套與對(duì)齊超詳細(xì)講解

    C語(yǔ)言結(jié)構(gòu)體嵌套與對(duì)齊超詳細(xì)講解

    這篇文章主要介紹了C語(yǔ)言結(jié)構(gòu)體嵌套與對(duì)齊,C語(yǔ)言中結(jié)構(gòu)體是一種構(gòu)造類型,和數(shù)組、基本數(shù)據(jù)類型一樣,可以定義指向該種類型的指針。結(jié)構(gòu)體指針的定義類似其他基本數(shù)據(jù)類型的定義
    2022-12-12
  • C++深入刨析muduo中的抽象類Poller

    C++深入刨析muduo中的抽象類Poller

    muduo網(wǎng)絡(luò)庫(kù)中Poller類是一個(gè)抽象類,用戶使用PollPoller或者EPollPoller類,下面跟隨小編一起來(lái)詳細(xì)了解一下
    2022-04-04
  • C語(yǔ)言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言動(dòng)態(tài)鏈表實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C++全面精通類與對(duì)象

    C++全面精通類與對(duì)象

    類和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱。對(duì)象是對(duì)客觀事物的抽象,類是對(duì)對(duì)象的抽象。類是一種抽象的數(shù)據(jù)類型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-05-05
  • C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(完整版)

    C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(完整版)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲

    C++實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)易貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解

    C++字符數(shù)組的輸入輸出和字符串結(jié)束標(biāo)志使用講解

    這篇文章主要介紹了C++字符數(shù)組的輸入輸出和符串結(jié)束標(biāo)志使用講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0

    這篇文章主要介紹了詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C語(yǔ)言FlappyBird飛揚(yáng)的小鳥(niǎo)實(shí)現(xiàn)開(kāi)發(fā)流程

    C語(yǔ)言FlappyBird飛揚(yáng)的小鳥(niǎo)實(shí)現(xiàn)開(kāi)發(fā)流程

    因?yàn)樵诩艺撕枚嗵?,隨手玩了下自己以前做的一些小游戲,說(shuō)真的,有幾個(gè)游戲做的是真的劣質(zhì),譬如 flappybird 真的讓我難以忍受,于是重做了一波分享給大家
    2022-11-11
  • 詳解C語(yǔ)言的mem系列函數(shù)

    詳解C語(yǔ)言的mem系列函數(shù)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的mem系列函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02

最新評(píng)論

龙门县| 潞西市| 临桂县| 马鞍山市| 天津市| 方山县| 宣武区| 石河子市| 奈曼旗| 临清市| 高要市| 英德市| 环江| 呼图壁县| 闵行区| 阿鲁科尔沁旗| 屏山县| 河西区| 闽侯县| 贵州省| 萝北县| 潮州市| 西乌珠穆沁旗| 永善县| 武穴市| 海宁市| 灵丘县| 锦屏县| 新安县| 凤翔县| 浦江县| 清水县| 江安县| 滨海县| 仪陇县| 抚宁县| 茌平县| 望谟县| 永年县| 沾化县| 和林格尔县|