亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中sizeof()與strlen()函數的使用入門及對比

2020-01-26 14:48:26
字體:
來源:轉載
供稿:網友

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

#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;}

運行結果:

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類型的數,是大于0的。
    代碼第三部分就簡單說明了數組名和指針變量的區別,即使你把指針變量指向數組名,編譯器依然能夠分辨出區別。

    以上講述的都沒有考慮在C99標準下的情況。因為在C99標準下有種特殊情況,那就是不定長數組的使用。當對不定長數組名使用sizeof的話,返回的也是整個數組的大小,就像實例中第四塊代碼一樣。但是這并不是在編譯階段執行的,而是在程序運行階段執行的。因為在編譯的時候,編譯器一般不知道變量的值是多少。(當然例子中我直接賦值3,可能不方便理解,可以假想iArraySize是通過scanf來獲得實際數值的,然后再聲明數組的)。對于這種情況,實際中應用的并不多,大家可以當做特殊情況對待即可,或者直接忽略掉也行……
6總結
    其實sizeof的作用就是告訴我們分配給變量的“建筑面積”的大小,只要記得這一點應該就夠了,不管這個變量類型是普通的整型數據,還是結構體,共用體,枚舉……記住這一點后,當我們再去想知道sizeof對不同數據類型操作返回的值到底是什么的時候,只需搞明白那些數據類型到底要消耗多少“建筑面積”就可以啦!

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

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

size_t strlen(const char *str)

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

返回值
這個函數返回字符串的長度。

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

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

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

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


sizeof與strlen的用法區別
1. sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。

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

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

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

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

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

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

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

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

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

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

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

都等價于 fun(char *)。

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

進入函數后用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” 所占的內存空間,是char類型的,占了1個字節,strlen(ss)= 10 >>>> 如果要獲得這個字符串的長度,則一定要使用 strlen.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av电影在线网| 在线播放国产一区二区三区| 欧美激情奇米色| 国内自拍欧美激情| 日韩欧美精品在线观看| 亚洲天堂av电影| 91国内在线视频| 亚洲欧美日韩精品久久| 亚洲精品成人久久久| 精品久久久精品| 亚洲欧美国产精品专区久久| 欧美在线免费视频| 欧美中文字幕第一页| 日韩电影中文字幕一区| 国产精品精品视频一区二区三区| 欧美有码在线观看视频| 国产精品久久久91| 中文字幕欧美在线| 欧美裸体xxxx极品少妇| 成人精品一区二区三区电影免费| 欧美性感美女h网站在线观看免费| 国产香蕉97碰碰久久人人| 欧美激情videos| 欧美人在线视频| 欧洲日韩成人av| 午夜精品久久久久久久男人的天堂| 亚洲在线第一页| 91美女片黄在线观| 午夜精品一区二区三区视频免费看| 久久亚洲欧美日韩精品专区| 国产主播喷水一区二区| 国产美女主播一区| 性欧美办公室18xxxxhd| 国产精品偷伦一区二区| 欧美日韩999| 亚洲欧美国产精品久久久久久久| 色综合伊人色综合网| 久久精品视频99| 亚洲天天在线日亚洲洲精| 亚洲成人免费在线视频| 久久久久免费精品国产| 日韩av网址在线| 久久精品亚洲精品| 91精品国产高清久久久久久91| 综合国产在线观看| 亚洲视频综合网| 成人免费淫片视频软件| 欧美贵妇videos办公室| 亚洲国产成人在线视频| 国产精品亚洲视频在线观看| 日韩在线视频播放| 亚洲男子天堂网| 精品久久久久久中文字幕一区奶水| 97国产成人精品视频| 欧美性xxxxxx| 欧美一区二区三区四区在线| 成人a视频在线观看| 亚洲国产天堂久久国产91| 久久69精品久久久久久国产越南| 欧美视频在线视频| 亚洲欧美中文日韩在线v日本| 日韩视频免费大全中文字幕| 国产精品久久久久国产a级| 国产精品99久久99久久久二8| 国产欧美日韩专区发布| 日韩av理论片| 国产精品无av码在线观看| 高清欧美性猛交xxxx| 亚洲精品国精品久久99热| 91免费福利视频| 国产精品福利小视频| 在线免费观看羞羞视频一区二区| 亚洲成人网久久久| 亚洲国产毛片完整版| 亚洲成人精品在线| 成人中文字幕+乱码+中文字幕| 国产精品一区二区电影| 精品人伦一区二区三区蜜桃网站| 国产精品伦子伦免费视频| 成人精品视频在线| 国产精品第三页| 国产午夜精品免费一区二区三区| 亚洲欧美中文字幕| 精品国内产的精品视频在线观看| 国产一区二中文字幕在线看| 91产国在线观看动作片喷水| 欧美精品中文字幕一区| 九九热精品在线| 精品五月天久久| 日韩美女中文字幕| 亚洲国产成人一区| 亚洲第一中文字幕在线观看| 日韩精品一区二区三区第95| 国产精品草莓在线免费观看| 色偷偷噜噜噜亚洲男人的天堂| 欧美日本国产在线| 亚洲欧洲中文天堂| 国产亚洲激情在线| 午夜精品久久久久久久久久久久| 国产成人在线一区| 成人欧美一区二区三区黑人| 狠狠躁天天躁日日躁欧美| 国产免费久久av| 91香蕉嫩草神马影院在线观看| 国产在线精品自拍| 国产精品国产亚洲伊人久久| 成人免费在线视频网站| 欧美黑人狂野猛交老妇| 91精品国产综合久久久久久久久| 精品偷拍一区二区三区在线看| 亚洲第一区第一页| 国产人妖伪娘一区91| 最新国产精品拍自在线播放| 日韩在线激情视频| 在线国产精品视频| 日韩黄色av网站| 久久综合国产精品台湾中文娱乐网| 中文字幕日韩av| 国产精品香蕉av| 亚洲人午夜精品免费| 欧美疯狂xxxx大交乱88av| 欧美激情免费在线| 亚洲国产成人久久| 精品视频在线播放免| 国产精品久久久久久久久久免费| 国产丝袜一区二区三区免费视频| 久久免费精品日本久久中文字幕| 一区二区三区久久精品| 黑人极品videos精品欧美裸| 日韩国产欧美精品在线| 国产欧美日韩免费看aⅴ视频| 中文字幕av日韩| 亚洲摸下面视频| 久久精品欧美视频| 色婷婷av一区二区三区在线观看| 色七七影院综合| 久久久久久午夜| 欧美精品久久久久久久| 国产精品99久久久久久久久久久久| 中文字幕亚洲一区| 久久国产精品久久国产精品| 亚洲a在线播放| 久久久久久成人精品| 法国裸体一区二区| 国产区精品视频| 欧美怡春院一区二区三区| 欧美激情在线观看视频| 不卡av在线播放| 亚洲日韩中文字幕在线播放| 欧美中文字幕第一页| 色婷婷综合久久久久| 成人黄色大片在线免费观看| 欧美日韩激情视频8区| 欧美成人性色生活仑片| 欧美黑人一区二区三区| 精品中文字幕视频| 午夜精品久久久久久久99热| 日韩精品在线电影| 91av网站在线播放| 精品免费在线观看| 日韩精品在线观看一区| 日韩av电影在线播放| 国产在线久久久| 久久视频在线视频|