亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

二、strlen
    strlen(...)是函數(shù),要在運行時才能計算。參數(shù)必須是字符型指針(char*)。當數(shù)組名作為參數(shù)傳入時,實際上數(shù)組就退化成指針了。
    它的功能是:返回字符串的長度。該字符串可能是自己定義的,也可能是內(nèi)存中隨機的,該函數(shù)實際完成的功能是從代表該字符串的第一個地址開始遍歷,直到遇到結(jié)束符NULL。返回的長度大小不包括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
    點評:sizeof返回定義arr數(shù)組時,編譯器為其分配的數(shù)組空間大小,不關(guān)心里面存了多少數(shù)據(jù)。strlen只關(guān)心存儲的數(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
    點評:第一個輸出結(jié)果23實際上每次運行可能不一樣,這取決于parr里面存了什么(從parr[0]開始知道遇到第一個NULL結(jié)束);第二個結(jié)果實際上本意是想計算parr所指向的動態(tài)內(nèi)存空間的大小,但是事與愿違,sizeof認為parr是個字符指針,因此返回的是該指針所占的空間(指針的存儲用的是長整型,所以為4);第三個結(jié)果,由于*parr所代表的是parr所指的地址空間存放的字符,所以長度為1。
************

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

1.sizeof操作符的結(jié)果類型是size_t,它在頭文件中typedef為unsigned int類型。
該類型保證能容納實現(xiàn)所建立的最大對象的字節(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.大部分編譯程序 在編譯的時候就把sizeof計算過了 是類型或是變量的長度這就是sizeof(x)可以用來定義數(shù)組維數(shù)的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

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

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

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

9.數(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 和 strlen 的時候,通常是計算字符串數(shù)組的長度
看了上面的詳細解釋,發(fā)現(xiàn)兩者的使用還是有區(qū)別的,從這個例子可以看得很清楚:

char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 計算字符串的長度,以結(jié)束符 0x00 為字符串結(jié)束。
int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的數(shù)組 str[20] 所占的內(nèi)存空間的大小,不受里面存儲的內(nèi)容改變。

上面是對靜態(tài)數(shù)組處理的結(jié)果,如果是對指針,結(jié)果就不一樣了

char* ss = "0123456789";
sizeof(ss) 結(jié)果 4 ===》ss是指向字符串常量的字符指針,sizeof 獲得的是一個指針的之所占的空間,應(yīng)該是

長整型的,所以是4
sizeof(*ss) 結(jié)果 1 ===》*ss是第一個字符 其實就是獲得了字符串的第一位'0' 所占的內(nèi)存空間,是char類

型的,占了 1 位

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

相關(guān)文章

  • C語言中返回錯誤信息的相關(guān)函數(shù)用法總結(jié)

    C語言中返回錯誤信息的相關(guān)函數(shù)用法總結(jié)

    這篇文章主要介紹了C語言中返回錯誤信息的相關(guān)函數(shù)用法總結(jié),包括strerror()函數(shù)和perror()函數(shù)以及ferror()函數(shù)的使用,需要的朋友可以參考下
    2015-09-09
  • 解析C++中的5個存儲類的作用

    解析C++中的5個存儲類的作用

    這篇文章主要介紹了C++中的5個存儲類的作用,存儲類是管理對象的生存期、鏈接和內(nèi)存位置的類型說明符,需要的朋友可以參考下
    2016-05-05
  • 基于Matlab繪制小提琴圖的示例代碼

    基于Matlab繪制小提琴圖的示例代碼

    這篇文章主要介紹了如何利用Matlab實現(xiàn)小提琴圖的繪制,文中的示例代碼講解詳細,對我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2022-05-05
  • C語言單鏈表實現(xiàn)方法詳解

    C語言單鏈表實現(xiàn)方法詳解

    這篇文章主要介紹了C語言單鏈表實現(xiàn)方法,結(jié)合實例形式分析了基于C語言的單鏈表定義、創(chuàng)建、添加、刪除、排序、打印等操作技巧,并附帶了相關(guān)的優(yōu)化算法,需要的朋友可以參考下
    2018-04-04
  • OpenCV圖像特征提取之Shi-Tomasi角點檢測算法詳解

    OpenCV圖像特征提取之Shi-Tomasi角點檢測算法詳解

    Harris角點檢測算法就是對角點響應(yīng)函數(shù)R進行閾值處理,Shi-Tomasi原理幾乎和Harris一樣的,只不過最后計算角點響應(yīng)的公式發(fā)生了變化。本文將和大家詳細說說Shi-Tomasi角點檢測算法的原理與實現(xiàn),需要的可以參考一下
    2022-09-09
  • C語言中函數(shù)的聲明、定義及使用的入門教程

    C語言中函數(shù)的聲明、定義及使用的入門教程

    這篇文章主要介紹了C語言中函數(shù)的聲明、定義及使用的入門教程,重點講述了main函數(shù)的相關(guān)知識,需要的朋友可以參考下
    2015-12-12
  • C++實現(xiàn)簡單掃雷游戲

    C++實現(xiàn)簡單掃雷游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言在linux下編程詳解

    C語言在linux下編程詳解

    這篇文章主要介紹了linux下基于C語言的編程,實例分析了基本使用技巧與相關(guān)概念,具有一定參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • C++詳解鏈棧的實現(xiàn)

    C++詳解鏈棧的實現(xiàn)

    今天我們學(xué)習(xí)的是鏈棧,也就是說棧的鏈式結(jié)構(gòu),我們運用順序鏈的方式來實現(xiàn)。首先呢,鏈棧是不存在存儲空間滿的情況的,所以可以說它是個無底洞,然而我們之前學(xué)的順序棧是有額定空間的
    2022-06-06
  • C語言最大公約數(shù)示例教程

    C語言最大公約數(shù)示例教程

    這篇文章主要為大家介紹了C語言最大公約數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-11-11

最新評論