淺談C語(yǔ)言中的sizeof()和strlen()的區(qū)別
sizeof()和strlen()經(jīng)常會(huì)被初學(xué)者混淆,但其中有有很大區(qū)別:
sizeof()
1. sizeof()【操作數(shù)所占空間的字節(jié)數(shù)大小】是一種c中的基本運(yùn)算符。
可以以類型、指針、數(shù)組和函數(shù)等作為參數(shù)。
返回值類型為unsigned int
運(yùn)算值在編譯的時(shí)候就出結(jié)果,所以可以用來(lái)定義數(shù)組維數(shù)。
char a[5]="123"; int b=sizeof(a);//b=5 int c=strlen(a);//c=3
sizeof()是一種單目操作符,是用來(lái)計(jì)算你所使用的操作數(shù)所占的空間字節(jié)大小。
// 證明返回?zé)o符號(hào)整形案例: int i=0; int main(){ i--; if(i>sizeof(i)){ printf(">"); }else{ printf("<"); } }
結(jié)果是>
i在main函數(shù)里為-1,由于sizeof(int)是無(wú)符號(hào)整形,c語(yǔ)言發(fā)生隱式類型轉(zhuǎn)換。會(huì)把-1直接看成有符號(hào)的數(shù)字,符號(hào)位會(huì)當(dāng)做數(shù)字來(lái)算,是一個(gè)很大的值。
strlen
2.strlen()[計(jì)算字符串的長(zhǎng)度]是一種函數(shù)。
'\0’作為終止符;
strlen的結(jié)果運(yùn)行的時(shí)候才出來(lái)(不是編譯期求值),是計(jì)算字符串長(zhǎng)度的。
其參數(shù)必須是字符型指針(char*)。
頭文件為#include<string.h>
size_t strlen(const char *str)//size_t()
以下是一些具體的實(shí)例(vs2013 設(shè)置為32位):
int main() { char *p = "hello"; char arr1 []= "hello"; char arr2[] = { 'h', 'e', 'l', 'l', 'o' }; printf("%d\n", sizeof( p)); //結(jié)果4,因?yàn)橹羔樧兞康乃伎臻g大小僅僅和操作系統(tǒng)位數(shù)有關(guān)32-4,64-8 printf("%d\n", sizeof(arr1)); //結(jié)果6,字符串默認(rèn)以\0結(jié)尾,sizeof()包含\0的計(jì)算 printf("%d\n", sizeof(arr2)); //結(jié)果為5,因?yàn)闉樽址捅硎?,并不含有\(zhòng)0(僅僅字符串有\(zhòng)0) printf("%d\n", strlen( p)); //結(jié)果為5,strlen求的是字符串的長(zhǎng)度,不包含\0 printf("%d\n", strlen(arr1)); //結(jié)果為5,strlen求的是字符串的長(zhǎng)度,不包含\0 printf("%d\n", strlen(arr2)); //因?yàn)樽址筒话琝0,但字符串需要找到\0才可結(jié)束,所以在'o'之后繼續(xù)向后讀取直到找到\0,所以是一個(gè)隨機(jī)值
結(jié)果如上;
設(shè)置為32位操作系統(tǒng)
補(bǔ)一個(gè)注意事項(xiàng):
#include <stdio.h> int main() { int arr[] = {1,2,(3,4),5};//整型數(shù)組 printf("%d\n", sizeof(arr)); return 0; }
注意數(shù)組的數(shù)據(jù)類型,char只占一個(gè)字節(jié),而int 數(shù)據(jù)類型四個(gè)字節(jié)哦,別忘了*4。前面的例子是char的。
#include <stdio.h> int main() { char arr[] = {1,2,(3,4),5};//字符型 printf("%d\n", sizeof(arr)); return 0; }
大量案例(想深入了解可以看)
補(bǔ)充幾個(gè)題:
1.(花括號(hào)int的sizeof())
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int arr[] = { 1, 2, 3, 4 }; printf("%d\n", sizeof(arr)); // 16 printf("%d\n", sizeof(arr + 0)); // 4 求 sizeof(int*) printf("%d\n", sizeof(*arr)); // 4, 求 sizeof(int) printf("%d\n", sizeof(arr + 1)); // 4, 求 sizeof(int*) printf("%d\n", sizeof(arr[1])); // 4, 求 sizeof(int) printf("%d\n", sizeof(&arr));// 4, 求 sizeof(int(*)[4]); printf("%d\n", sizeof(*&arr));// 16, 求 sizeof(int[4]); printf("%d\n", sizeof(&*arr));// 4, 求 sizeof(int*) printf("%d\n", sizeof(&arr + 1)); // 4, 求 sizeof(int(*)[4]) printf("%d\n", sizeof(&arr[0])); // 4, 求 sizeof(int*) printf("%d\n", sizeof(&arr[0] + 1)); // 4, 求 sizeof(int*) system("pause"); return 0; }
花括號(hào)定義不帶’\0’,所以求strlen就是未定義行為,所以就只有sizeof().
2.(花括號(hào)char的sizeof())
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' }; printf("%d\n", sizeof(arr)); // 6, sizeof(char[6]) printf("%d\n", sizeof(arr + 0)); // 4, sizeof(char*) printf("%d\n", sizeof(*arr)); // 1, sizeof(char) printf("%d\n", sizeof(arr + 1)); // 4 printf("%d\n", sizeof(arr[1]));// 1, sizeof(char) printf("%d\n", sizeof(&arr));// 4, sizeof(char(*)[6]) printf("%d\n", sizeof(*&arr)); // 6, sizeof(char[6]) printf("%d\n", sizeof(&*arr));// 4, sizeof(char*) printf("%d\n", sizeof(&arr[1] + 1)); // 4, sizeof(char*) printf("%d\n", sizeof(&arr + 1)); // 4, sizeof(char(*)[6]); system("pause"); return 0; }
花括號(hào)定義不帶’\0’,所以求strlen就是未定義行為,所以就只有sizeof().
3.(字符串char的sizeof()和strlen)
char arr[] = "abcdef"; printf("%d\n", sizeof(arr)); // 7, sizeof(char[7]); printf("%d\n", sizeof(arr + 0)); // 4, sizeof(char*) printf("%d\n", sizeof(*arr)); // 1, sizeof(char) printf("%d\n", sizeof(arr[1])); // 1, sizeof(char) printf("%d\n", sizeof(&arr[0] + 1)); // 4, sizeof(char*) printf("%d\n", sizeof(&arr)); // 4 sizeof(char(*)[7]) printf("%d\n", sizeof(*&arr)); // 7 sizeof(char[7]) printf("%d\n", sizeof(&*arr)); // 4 sizeof(char*) printf("%d\n", sizeof(&arr + 1)); // 4 sizeof(char(*)[7]) printf("%d\n", strlen(arr)); // 6 printf("%d\n", strlen(arr + 1)); // 5 printf("%d\n", strlen(&arr + 1)); //類型不匹配 printf("%d\n", strlen(&arr)); // 類型不匹配 printf("%d\n", strlen(&arr[0])); // 6 printf("%d\n", strlen(*&arr)); // 6 printf("%d\n", strlen(&*arr)); // 6 printf("%d\n", strlen(&arr[1] + 1));//4
strlen中類型不匹配是因?yàn)樗麄兊臄?shù)據(jù)類型不是char*.
4.(指針定義的sizeof()和strlen)
這個(gè)例題其實(shí)有點(diǎn)偏題了,涉及到指針和數(shù)組的隱式轉(zhuǎn)化(感興趣的可以去看我的博客–指針基礎(chǔ)總結(jié)詳解(里面有指針和數(shù)組的講解))
char* p = "abcdef"; printf("%d\n", sizeof(p)); // 4 sizeof(char*) printf("%d\n", sizeof(p + 1)); // 4 sizeof(char*) printf("%d\n", sizeof(*p)); // 1 sizeof(char) printf("%d\n", sizeof(p[0])); // 1 sizeof(char) printf("%d\n", sizeof(&p)); // 4 sizeof(char**) printf("%d\n", sizeof(&p[1] + 1)); // 4 sizeof(char*) printf("%d\n", sizeof(*&p)); // 4 sizeof(char*) printf("%d\n", sizeof(&*p)); // 4 sizeof(char*) printf("%d\n", strlen(p)); // 6 printf("%d\n", strlen(p + 1)); // 5 printf("%d\n", strlen(*p)); // 類型不匹配 printf("%d\n", strlen(p[1])); // 類型不匹配 printf("%d\n", strlen(&p)); // 類型不匹配. printf("%d\n", strlen(&p[1] + 1)); // 4 printf("%d\n", strlen(*&p)); // 6 printf("%d\n", strlen(&*p)); // 6
strlen中類型不匹配是因?yàn)樗麄兊臄?shù)據(jù)類型不是char*.
5.(花括號(hào)二維數(shù)組int的sizeof())
int arr[3][4] = { 0 }; printf("%d\n", sizeof(arr)); // 48 sizeof(int[3][4]) printf("%d\n", sizeof(arr[0])); // 16 sizeof(int[4]) // arr[0] int[4], 再 + 1, 就把 int[4] 轉(zhuǎn)成 int* 了 printf("%d\n", sizeof(arr[0] + 1)); // 4 sizeof(int*) printf("%d\n", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4]) printf("%d\n", sizeof(arr[0][0])); // 4 sizeof(int) printf("%d\n", sizeof(*arr[0])); // 4, sizeof(int) // arr 是二維數(shù)組 int[3][4] => int(*)[4] => * => int[4] printf("%d\n", sizeof(*arr)); // 16 sizeof(int[4]) // arr + 1 => int(*)[4] => * => int[4] printf("%d\n", sizeof(*(arr + 1))); // 16 sizeof(int[4]) // arr => int[3][4] => int(*)[4] => * => int[4] => +1 => int* printf("%d\n", sizeof(*arr + 1)); // 4 arr[0] => int[4] => & => int(*)[4] => +1 => int(*)[4] printf("%d\n", sizeof(&arr[0] + 1)); // 4 sizeof(int(*)[4]) printf("%d\n", sizeof(*(arr[0] + 1))); // 4 arr[0] => int[4] => +1 => int* => * => int
到此這篇關(guān)于淺談C語(yǔ)言中的sizeof()和strlen()的區(qū)別的文章就介紹到這了,更多相關(guān)C語(yǔ)言 sizeof()和strlen()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言sizeof和strlen區(qū)別小結(jié)
- C語(yǔ)言中sizeof和strlen的區(qū)別詳解
- C語(yǔ)言中的strlen()和sizeof()對(duì)比分析
- C語(yǔ)言之sizeof與strlen的使用及區(qū)別
- 關(guān)于C語(yǔ)言strlen與sizeof區(qū)別詳情
- C語(yǔ)言入門篇--sizeof與strlen基礎(chǔ)理論
- C語(yǔ)言中sizeof()與strlen()的區(qū)別詳解
- C語(yǔ)言中sizeof()與strlen()函數(shù)的使用入門及對(duì)比
- C語(yǔ)言中關(guān)于sizeof 和 strlen的區(qū)別分析
- C語(yǔ)言中sizeof 和 strlen的區(qū)別
相關(guān)文章
C數(shù)據(jù)結(jié)構(gòu)之雙鏈表詳細(xì)示例分析
以下是對(duì)c語(yǔ)言中的雙鏈表進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-08-08c++動(dòng)態(tài)內(nèi)存空間示例(自定義空間類型大小和空間長(zhǎng)度)
這篇文章主要介紹了c++動(dòng)態(tài)內(nèi)存空間示例,自定義空間類型大小和空間長(zhǎng)度,需要的朋友可以參考下2014-04-04C語(yǔ)言超細(xì)致講解循環(huán)語(yǔ)句
我們說(shuō)到當(dāng)滿足特定條件時(shí),就會(huì)執(zhí)行if語(yǔ)句或者switch語(yǔ)句后面的語(yǔ)句,否則不執(zhí)行,但是這只能執(zhí)行一次,在日常生活中,有些事情是需要重復(fù)去做的,C語(yǔ)句就為此引入了循環(huán)語(yǔ)句。所以今天繼續(xù)為大家分享C語(yǔ)言循環(huán)家族2022-05-05C語(yǔ)言位運(yùn)算和sizeof運(yùn)算符詳解
這篇文章主要介紹了C語(yǔ)言位運(yùn)算和sizeof運(yùn)算符詳解的相關(guān)資料,這里提供了詳細(xì)的知識(shí)要點(diǎn),并附簡(jiǎn)單代碼示例,需要的朋友可以參考下2016-11-11c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于c++將字符串轉(zhuǎn)數(shù)字的實(shí)例方法,有需要的朋友們可以參考下。2020-02-02關(guān)于C/C++中static關(guān)鍵字的作用總結(jié)
以下是對(duì)C/C++中static關(guān)鍵字的作用進(jìn)行了總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下2013-09-09