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

C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門(mén)及對(duì)比

 更新時(shí)間:2015年12月02日 14:39:29   作者:守夜者  
這篇文章主要介紹了C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門(mén)及對(duì)比,同時(shí)二者在C++中的使用情況也基本上同理,是需要的朋友可以參考下

sizeof()函數(shù)
1,是什么?
    sizeof其實(shí)就是一個(gè)運(yùn)算符,和那些+,-一樣的東西,在程序編譯的時(shí)候進(jìn)行解析轉(zhuǎn)換。雖然我們經(jīng)常見(jiàn)到sizeof后面跟著個(gè)小括號(hào),長(zhǎng)得和函數(shù)差不多,但它和函數(shù)完全是兩碼事。
2,有什么用?
    sizeof其實(shí)就是用于告訴我們編譯器在為某一特定數(shù)據(jù)或者某種數(shù)據(jù)類(lèi)型的數(shù)據(jù)在存儲(chǔ)空間中開(kāi)辟空間時(shí),開(kāi)辟的空間大小,以字節(jié)為單位。
3,怎么用?
    sizeof(類(lèi)型),或者sizeof(變量)都可以,得到的就是類(lèi)型或者變量的存儲(chǔ)空間。當(dāng)對(duì)變量用的時(shí)候,也可以沒(méi)有括號(hào),直接 sizeof 變量,但一般不用(我一般都是只記一種通用的用法……)。
4,用的時(shí)候要注意什么?
(1)sizeof返回的占用空間大小是為這個(gè)變量開(kāi)辟的大小,而不只是它用到的空間。和現(xiàn)今住房的建筑面積和實(shí)用面積的概念差不多。所以對(duì)結(jié)構(gòu)體用的時(shí)候,大多情況下就得考慮字節(jié)對(duì)齊的問(wèn)題了。
(2)對(duì)位域成員等連編譯器都無(wú)法確定存儲(chǔ)空間的東西不能用。這個(gè)應(yīng)該比較好理解,因?yàn)閟izeof返回的都是以字節(jié)為單位的數(shù)據(jù),你讓它去求那些以位為單位的大小,這不是存心難為編譯器嘛。所以編譯器采用的方案是統(tǒng)一不受理,即使你說(shuō)你剛好是8位,占一個(gè)字節(jié),編譯器也不理你。
(3)sizeof返回的數(shù)據(jù)類(lèi)型是unsigned int。因?yàn)镃中不同類(lèi)型數(shù)據(jù)混合運(yùn)算時(shí)的自動(dòng)轉(zhuǎn)換,有時(shí)候不注意的話(huà)可能會(huì)出問(wèn)題,具體可以參照下面的程序例子。
(4)要注意數(shù)組名和指針變量的區(qū)別。通常情況下,我們總覺(jué)得數(shù)組名和指針變量差不多,但是在用sizeof的時(shí)候差別很大,對(duì)數(shù)組名用sizeof返回的是整個(gè)數(shù)組的大小,而對(duì)指針變量進(jìn)行操作的時(shí)候返回的則是指針變量本身所占得空間,在32位機(jī)的條件下一般都是4。而且當(dāng)數(shù)組名作為函數(shù)參數(shù)時(shí),在函數(shù)內(nèi)部,形參也就是個(gè)指針,所以不再返回?cái)?shù)組的大小。
5,實(shí)例分析
源碼:

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

運(yùn)行結(jié)果:

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

結(jié)果分析:
    代碼第一部分主要就是簡(jiǎn)單的表示了一下用法。
    第二部分說(shuō)明了注意事項(xiàng)的第三項(xiàng)。按說(shuō),iVal的值是3,減4的話(huà)應(yīng)該是-1,小于0,輸出的應(yīng)該是"he return type is int"。但是由于當(dāng)int和unsigned int一起運(yùn)算時(shí),會(huì)默認(rèn)變成unsigned int,所以結(jié)果會(huì)是一個(gè)很大的unsigned int類(lèi)型的數(shù),是大于0的。
    代碼第三部分就簡(jiǎn)單說(shuō)明了數(shù)組名和指針變量的區(qū)別,即使你把指針變量指向數(shù)組名,編譯器依然能夠分辨出區(qū)別。

    以上講述的都沒(méi)有考慮在C99標(biāo)準(zhǔn)下的情況。因?yàn)樵贑99標(biāo)準(zhǔn)下有種特殊情況,那就是不定長(zhǎng)數(shù)組的使用。當(dāng)對(duì)不定長(zhǎng)數(shù)組名使用sizeof的話(huà),返回的也是整個(gè)數(shù)組的大小,就像實(shí)例中第四塊代碼一樣。但是這并不是在編譯階段執(zhí)行的,而是在程序運(yùn)行階段執(zhí)行的。因?yàn)樵诰幾g的時(shí)候,編譯器一般不知道變量的值是多少。(當(dāng)然例子中我直接賦值3,可能不方便理解,可以假想iArraySize是通過(guò)scanf來(lái)獲得實(shí)際數(shù)值的,然后再聲明數(shù)組的)。對(duì)于這種情況,實(shí)際中應(yīng)用的并不多,大家可以當(dāng)做特殊情況對(duì)待即可,或者直接忽略掉也行……
6總結(jié)
    其實(shí)sizeof的作用就是告訴我們分配給變量的“建筑面積”的大小,只要記得這一點(diǎn)應(yīng)該就夠了,不管這個(gè)變量類(lèi)型是普通的整型數(shù)據(jù),還是結(jié)構(gòu)體,共用體,枚舉……記住這一點(diǎn)后,當(dāng)我們?cè)偃ハ胫纒izeof對(duì)不同數(shù)據(jù)類(lèi)型操作返回的值到底是什么的時(shí)候,只需搞明白那些數(shù)據(jù)類(lèi)型到底要消耗多少“建筑面積”就可以啦!

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

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

size_t strlen(const char *str)

參數(shù)
str -- 這是字符串的長(zhǎng)度要計(jì)算的。

返回值
這個(gè)函數(shù)返回字符串的長(zhǎng)度。

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

#include <stdio.h>
#include <string.h>

int 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);
}

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

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


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

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

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

short f();
printf("%d\n", sizeof(f()));

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

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

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

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

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

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

7. 數(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對(duì)指針的話(huà),結(jié)果是相應(yīng)的類(lèi)型:

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個(gè)字節(jié),strlen(ss)= 10 >>>> 如果要獲得這個(gè)字符串的長(zhǎng)度,則一定要使用 strlen.

相關(guān)文章

  • 詳解C語(yǔ)言之柔性數(shù)組

    詳解C語(yǔ)言之柔性數(shù)組

    這篇文章主要介紹了C語(yǔ)言柔性數(shù)組,通過(guò)實(shí)例分析了不完整類(lèi)型、結(jié)構(gòu)體及柔性數(shù)組等概念,需要的朋友可以參考下
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單的學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++實(shí)現(xiàn)圖的鄰接表存儲(chǔ)和廣度優(yōu)先遍歷實(shí)例分析

    C++實(shí)現(xiàn)圖的鄰接表存儲(chǔ)和廣度優(yōu)先遍歷實(shí)例分析

    這篇文章主要介紹了C++實(shí)現(xiàn)圖的鄰接表存儲(chǔ)和廣度優(yōu)先遍歷,實(shí)例分析了C++實(shí)現(xiàn)圖的存儲(chǔ)與遍歷技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn)

    深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn)

    今天小編就為大家分享一篇關(guān)于深度剖析C++對(duì)象池自動(dòng)回收技術(shù)實(shí)現(xiàn),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • c語(yǔ)言實(shí)現(xiàn)兩個(gè)單鏈表的交叉合并方式

    c語(yǔ)言實(shí)現(xiàn)兩個(gè)單鏈表的交叉合并方式

    今天小編就為大家分享一篇c語(yǔ)言實(shí)現(xiàn)兩個(gè)單鏈表的交叉合并方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C++實(shí)現(xiàn)快速排序(Quicksort)算法

    C++實(shí)現(xiàn)快速排序(Quicksort)算法

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)快速排序(Quicksort)算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表

    C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表

    這篇文章主要為大家詳細(xì)介紹了C++數(shù)據(jù)結(jié)構(gòu)之實(shí)現(xiàn)鄰接表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++淺析類(lèi)與對(duì)象的基礎(chǔ)

    C++淺析類(lèi)與對(duì)象的基礎(chǔ)

    類(lèi)和對(duì)象是兩種以計(jì)算機(jī)為載體的計(jì)算機(jī)語(yǔ)言的合稱(chēng)。對(duì)象是對(duì)客觀(guān)事物的抽象,類(lèi)是對(duì)對(duì)象的抽象。類(lèi)是一種抽象的數(shù)據(jù)類(lèi)型;變量就是可以變化的量,存儲(chǔ)在內(nèi)存中—個(gè)可以擁有在某個(gè)范圍內(nèi)的可變存儲(chǔ)區(qū)域
    2022-05-05
  • C語(yǔ)言的位段與枚舉詳解

    C語(yǔ)言的位段與枚舉詳解

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

最新評(píng)論

娄烦县| 万全县| 任丘市| 青田县| 宁安市| 沙湾县| 新龙县| 屯昌县| 丰台区| 乐亭县| 濮阳县| 乌拉特中旗| 邵东县| 太谷县| 崇义县| 平利县| 黄浦区| 龙口市| 水富县| 德钦县| 海晏县| 定远县| 茌平县| 久治县| 温宿县| 东至县| 铜陵市| 天峨县| 澄江县| 灌阳县| 庆云县| 嘉义县| 大港区| 呼图壁县| 南京市| 托里县| 游戏| 余姚市| 神农架林区| 修文县| 阿合奇县|