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

淺談C語(yǔ)言中的sizeof()和strlen()的區(qū)別

 更新時(shí)間:2022年05月07日 14:51:55   作者:zhaocx111222333  
本文主要介紹了C語(yǔ)言中的sizeof()和strlen()的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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ī)值

程序運(yùn)行結(jié)果如上

結(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言修煉之路靈根孕育源流出?初識(shí)C言大道生下篇

    C語(yǔ)言修煉之路靈根孕育源流出?初識(shí)C言大道生下篇

    C語(yǔ)言是一門面向過(guò)程、抽象化的通用程序設(shè)計(jì)語(yǔ)言,廣泛應(yīng)用于底層開發(fā)。C語(yǔ)言能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器。C語(yǔ)言是僅產(chǎn)生少量的機(jī)器語(yǔ)言以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的高效率程序設(shè)計(jì)語(yǔ)言
    2022-03-03
  • C++?BoostAsyncSocket實(shí)現(xiàn)異步反彈通信的案例詳解

    C++?BoostAsyncSocket實(shí)現(xiàn)異步反彈通信的案例詳解

    這篇文章主要為大家詳細(xì)介紹了C++?BoostAsyncSocket如何實(shí)現(xiàn)異步反彈通信,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-03-03
  • Linux環(huán)境下段錯(cuò)誤的產(chǎn)生原因及調(diào)試方法小結(jié)

    Linux環(huán)境下段錯(cuò)誤的產(chǎn)生原因及調(diào)試方法小結(jié)

    借此機(jī)會(huì)系統(tǒng)學(xué)習(xí)了一下,這里對(duì)Linux環(huán)境下的段錯(cuò)誤做個(gè)小結(jié),方便以后同類問(wèn)題的排查與解決
    2011-11-11
  • 詳解C++程序中定義struct結(jié)構(gòu)體的方法

    詳解C++程序中定義struct結(jié)構(gòu)體的方法

    C++中同樣擁有C語(yǔ)言中的結(jié)構(gòu)體,下面就來(lái)詳解C++程序中定義struct結(jié)構(gòu)體的方法,需要的朋友可以參考下
    2016-05-05
  • C++ OpenCV繪制幾何圖形

    C++ OpenCV繪制幾何圖形

    這篇文章主要為大家詳細(xì)介紹了C++ OpenCV繪制幾何圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池的示例代碼

    使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池的示例代碼

    所謂內(nèi)存池,顧名思義和線程池的設(shè)計(jì)原理是一樣的,為了減少頻繁申請(qǐng)釋放內(nèi)存而帶來(lái)的資源消耗,減少釋放內(nèi)存后產(chǎn)生的內(nèi)存碎片,下面我們就來(lái)看看如何使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池吧
    2024-02-02
  • 一篇文章帶你掌握C++虛函數(shù)的來(lái)龍去脈

    一篇文章帶你掌握C++虛函數(shù)的來(lái)龍去脈

    虛函數(shù)主要通過(guò)V-Table虛函數(shù)表來(lái)實(shí)現(xiàn),該表主要包含一個(gè)類的虛函數(shù)的地址表,可解決繼承、覆蓋的問(wèn)題,下面這篇文章主要給大家介紹了如何通過(guò)一篇文章帶你掌握C++虛函數(shù)的來(lái)龍去脈,需要的朋友可以參考下
    2022-10-10
  • C++數(shù)據(jù)結(jié)構(gòu)之鏈表詳解

    C++數(shù)據(jù)結(jié)構(gòu)之鏈表詳解

    這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建的相關(guān)資料,希望通過(guò)本文幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例

    C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C數(shù)據(jù)結(jié)構(gòu)中串簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • LZ77壓縮算法原理的理解

    LZ77壓縮算法原理的理解

    這篇文章主要介紹了LZ77壓縮算法原理的理解的相關(guān)資料,數(shù)據(jù)壓縮是一個(gè)減小數(shù)據(jù)存儲(chǔ)空間的過(guò)程,目前被應(yīng)用在軟件工程的各個(gè)地方,了解其一些原理,方便我們更好的甄選壓縮方案,需要的朋友可以參考下
    2017-08-08

最新評(píng)論

清流县| 万盛区| 安宁市| 新巴尔虎左旗| 蒲江县| 璧山县| 奉贤区| 九寨沟县| 勐海县| 洪湖市| 原平市| 卫辉市| 漳平市| 郑州市| 志丹县| 桐城市| 上栗县| 班戈县| 惠安县| 和林格尔县| 保定市| 徐闻县| 台东市| 永济市| 吐鲁番市| 勃利县| 社会| 崇阳县| 怀集县| 京山县| 太康县| 平阴县| 玉龙| 潍坊市| 台南县| 台江县| 九寨沟县| 驻马店市| 怀仁县| 嘉荫县| 玉溪市|