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

C語言使用sizeof和strlen計(jì)算數(shù)組和指針大小

 更新時(shí)間:2023年11月10日 15:08:46   作者:威震江湖夢  
sizeof()一般是用來求取?變量?或者?類型?所占內(nèi)存空間的大小,strlen()是一個(gè)庫函數(shù)是專門用來計(jì)算?字符串?長度的,下面我們就來看看C語言如何使用sizeof和strlen計(jì)算數(shù)組和指針大小吧

一、知識(shí)回顧

1、回顧sizeof()、strlen的作用

  • sizeof()是用來求取 變量 或者 類型 所占內(nèi)存空間的大?。▎挝唬鹤止?jié))。
  • sizeof計(jì)算的是占用內(nèi)存空間的大小,單位是字節(jié),不關(guān)注內(nèi)存中到底存放的是什么。sizeof不是函數(shù),是操作符
  • strlen()是一個(gè)庫函數(shù)是專門用來計(jì)算 字符串 長度的,在對其進(jìn)行調(diào)用前是需要包含頭文件<string.h>。
  • strlen()函數(shù)是通過字符串結(jié)束標(biāo)志 \0 來計(jì)算字符串長度的,但計(jì)算出來的字符串長度是不包括 \0 的,也就是說所謂的長度就是 \0 前字符的個(gè)數(shù)。strlen是函數(shù)

sizeof是一個(gè)運(yùn)算符,用于計(jì)算一個(gè)變量或數(shù)據(jù)類型所占的字節(jié)數(shù),不論變量中存儲(chǔ)的數(shù)據(jù)是否為空。而strlen是一個(gè)函數(shù),用于計(jì)算一個(gè)字符串中的字符數(shù),不包括字符串末尾的空字符'\0'。 另外,sizeof可以用于計(jì)算任意數(shù)據(jù)類型的大小,包括基本數(shù)據(jù)類型和自定義數(shù)據(jù)類型。 而strlen只能用于計(jì)算字符串的長度。 因此,sizeof通常用于確定數(shù)組所占的存儲(chǔ)空間,而strlen用于確定字符串的長度。

2、數(shù)組和指針

  • 數(shù)組 - 能夠存放一組相同類型的元素,數(shù)組的大小取決于數(shù)組的元素個(gè)數(shù)和元素類型。
  • 指針就是地址,大小都是4/8。(32位機(jī)器是4字節(jié),64位機(jī)器是8字節(jié))

3、數(shù)組名

大部分情況下數(shù)組名是首元素地址。

2個(gè)例外 sizeof(數(shù)組名) —— 數(shù)組名表示整個(gè)數(shù)組,計(jì)算的是整個(gè)數(shù)組的大小。(看數(shù)組名是否是單獨(dú)放在sizeof()里面) &數(shù)組名 ————-數(shù)組名表示整個(gè)數(shù)組,取出的是數(shù)組的地址

二、sizeof()、strlen()的對比

1、注意區(qū)別

  • 字符數(shù)組 - char arr1[]={'a','b','c','d','e','f'} ->[a,b,c,d,e,f]
  • 字符串?dāng)?shù)組 - char arr2[]="abcdef" ->[a,b,c,d,e,f,/0]
  • sizeof()計(jì)算的是占用內(nèi)存空間的大小,單位是字節(jié),不關(guān)注內(nèi)存中到底存放的是什么。
  • strlen()是針對字符串的,求的是字符串的長度,本質(zhì)上統(tǒng)計(jì)的是/0之前出現(xiàn)的字符個(gè)數(shù)。

2、一維數(shù)組與一級(jí)指針

整型數(shù)組

	int a[] = { 1,2,3,4 };
	
	printf("%d\n", sizeof(a[1]));//4
	
	printf("%d\n", sizeof(a));//16 
	//sizeof(a) 就是數(shù)組名單獨(dú)放在sizeof內(nèi)部 計(jì)算的是整個(gè)數(shù)組的大小。

	printf("%d\n", sizeof(a + 0));// 4/8
	//a + 0   a不是單獨(dú)放在sizeof()里面,則是數(shù)組首元素的地址,sizeof則是計(jì)算數(shù)組首元素地址的大小
	
	printf("%d\n", sizeof(*a));//4
	//a不是單獨(dú)放在sizeof()里面,則是數(shù)組首元素的地址 *a == a[0],sizeof()則是計(jì)算首元素的大小。
	//*a -> *&a[0] -> a[0]

	printf("%d\n", sizeof(a + 1));// 4/8
	//a不是單獨(dú)放在sizeof()里面,則是數(shù)組首元素的地址 -- int*
	//a+1 跳過1個(gè)整型,是第二個(gè)元素的地址 sizeof()是計(jì)算第二個(gè)元素地址的大小。

	printf("%d\n", sizeof(&a));/ /4/8
	//&a - 取出的是數(shù)組的地址,但是數(shù)組的地址也是地址,地址的的大小就是4/8。
	//int (*pa)[4] = &a;

	printf("%d\n", sizeof(*&a));//16
	//等于sizeof(a)

	printf("%d\n", sizeof(&a+1));// 4/8
	//&a --> int (*)[4],取出的是數(shù)組的地址。
	//&a + 1 則要跳過一個(gè)數(shù)組。

	printf("%d\n", sizeof(&a[0]));
	//取出首元素地址,sizeof計(jì)算的是元素的地址4/8
	
	printf("%d\n", sizeof(&a[0]+1));//4/8
	//取出的是第二個(gè)元素的地址,sizeof()計(jì)算的是地址的大小。

字符數(shù)組

	char arr[] = {'a','b','c','d','e','f'};
	
	printf("%d\n", sizeof(arr));//6
	
	printf("%d\n", sizeof(arr + 0));// 4/8
	//arr不單獨(dú)放在sizeof里面,是數(shù)組首元素的地址 ,計(jì)算的大小為4/8
	
	printf("%d\n", sizeof(*arr));//1
	//arr不單獨(dú)放在sizeof里面,arr是首元素地址,*arr 是首元素,大小為1
	
	printf("%d\n", sizeof(arr[1]));//元素'b'
	
	printf("%d\n", sizeof(&arr));// 4/8
	//&arr 是數(shù)組的地址,地址的大小的都是 4/8
	
	printf("%d\n", sizeof(&arr + 1));//4/8
	printf("%d\n", sizeof(&arr[0] + 1));//4/8
	
	//*****************************************
	
	printf("%d\n", strlen(arr));//隨機(jī)值
	//arr數(shù)組首元素地址,找不到‘\0',所以是計(jì)算的大小是隨機(jī)值
	printf("%d\n", strlen(arr + 0));//隨機(jī)值,同上
	
	printf("%d\n", strlen(*arr));//非法訪問
	//strlen傳入char*(地址)
	//*arr = 'a'——>(97)被當(dāng)成地址,非法訪問
	
	printf("%d\n", strlen(arr[1]));//非法訪問,同上
	
	printf("%d\n", strlen(&arr));//隨機(jī)值
	//找不到/0
		
	printf("%d\n", strlen(&arr + 1));//隨機(jī)值 - 6
	printf("%d\n", strlen(&arr[0] + 0));//隨機(jī)值 - 1

字符串?dāng)?shù)組

	char arr[]="abcdef";//[a b c d e f /0]
	
	printf("%d\n",sizeof(arr));//整個(gè)數(shù)組大小 7
	printf("%d\n",sizeof(arr+0));//首元素地址大小 4/8
	
	printf("%d\n",sizeof(*arr));//首元素大小 1
	//*arr = arr[0] = *(arr+0)
	
	printf("%d\n",sizeof(arr[1]));//1
	
	printf("%d\n",sizeof(&arr));//數(shù)組的地址,大小 4/8
	printf("%d\n",sizeof(&arr+1));//+1 跳過一個(gè)數(shù)組的地址,大小 4/8
	printf("%d\n",sizeof(&arr[0]+1));//+1 跳過一個(gè)元素的地址,大小 4/8
	
	//******************************************************************

	printf("%d\n",strlen(arr));//arr表示首元素地址,計(jì)算得到數(shù)組大小為 6
	printf("%d\n",strlen(arr+0));//6,同上
	
	printf("%d\n",strlen(*arr));//非法訪問
	printf("%d\n",strlen(arr[1]));//非法訪問
	//strlen是傳入char*地址,*arr和arr[1]是數(shù)組的元素,傳給strlen會(huì)被當(dāng)做地址,造成非法訪問
	
	printf("%d\n",strlen(&arr));//&arr表示整個(gè)數(shù)組的大小,6
	printf("%d\n",strlen(&arr+1));//數(shù)組的地址 +1后就找不到 /0 ,大小為隨機(jī)值
	printf("%d\n",strlen(&arr[0]+1));//從第二個(gè)元素開始算,大小為5

指針

	char* p="abcdef";
	printf("%d\n",sizeof(p));//4/8
	//指針變量p 存放著的是地址,所以大小為4/8
	
	printf("%d\n",sizeof(p+1));//字符'b‘的地址,大小為4/8
	
	printf("%d\n",sizeof(*p));
	//解引用的一個(gè)char類型元素,大小為1
	
	printf("%d\n",sizeof(p[0]));//1
	//p[0] = *(p+0)
	printf("%d\n",sizeof(&p));//4/8
	
	printf("%d\n",sizeof(&p+1));
	//+1跳過一個(gè)char*地址,還是地址,大小還是4/8

	//********************************************

	printf("%d\n",strlen(p));//大小為 6
	printf("%d\n",strlen(p+1));//p+1是'b'的地址,從'b'開始算,大小為5
	printf("%d\n",strlen(*p));//*p為'a',不是地址,非法訪問
	
	printf("%d\n",strlen(&p));//隨機(jī)值
	//&p取的是變量p的地址,不是p里面存放的地址,所以無法找打字符串
	printf("%d\n",strlen(&p+1));//隨機(jī)值,同上
	
	printf("%d\n",strlen(&p[0]+1));//大小為 5
	//p[0]是'a‘,&p[0]去'a'的地址,+1的'b'的地址,從'b'開始計(jì)算
	

3、二維數(shù)組與二級(jí)指針

整型數(shù)組

	int a[3][4]={0};//三行四列的數(shù)組
	printf("%d\n",sizeof(a));//4*3*4=48
	//a這個(gè)數(shù)組名單獨(dú)放在sizeof里面,表示整個(gè)數(shù)組,計(jì)算的是整個(gè)數(shù)組的大小
	
	printf("%d\n",sizeof(a[0][0]));//第一行第一個(gè)元素,大小4字節(jié)
	
	printf("%d\n",sizeof(a[0]));//16
	//a[0] 是第一行的數(shù)組名,這是數(shù)組名單獨(dú)放在sizeof內(nèi)部,計(jì)算的是第一行數(shù)組的大小
	
	printf("%d\n",sizeof(a[0]+1));//4/8
	//a[0]不是單獨(dú)放在sizeof內(nèi)部,表示的是首元素的地址。即第一行第一個(gè)元素的地址,相當(dāng)于&a[0][0]
	//a[0]+1 是第一行第二個(gè)元素的地址,相當(dāng)于&a[0][1]
	
	printf("%d\n",sizeof(a+1));//4/8
	//a作為二維數(shù)組的數(shù)組名,并非單獨(dú)放在sizeof內(nèi)部,所以表示首元素是地址
	//二維數(shù)組的首元素是第一行,這里的a就是第一行的地址
	//a+1是跳過第一行,指向第二行
	
	printf("%d\n",sizeof(*(a+1)));//16
	//*(a+1) -> a[1],計(jì)算的是第二行的大小
	
	printf("%d\n",sizeof(&a[0]+1));//4/8
	//&a[0]是第一行的地址
	//&a[0]+1是第二行的地址
	
	printf("%d\n",sizeof(*(&a[0]+1)));//表示第二行,大小為16
	printf("%d\n",sizeof(*a));//16
	//*a --> *(a+0)表示第一行,大小為16

三、總結(jié)回顧

sizeof(數(shù)組名),這里的數(shù)組名表示整個(gè)數(shù)組,計(jì)算的是數(shù)組的大小。

&數(shù)組名,這里的數(shù)組名表示整數(shù)數(shù)組,取出的是整個(gè)數(shù)組的地址。

除此之外所有的數(shù)組名都表示首元素的地址。

到此這篇關(guān)于C語言使用sizeof和strlen計(jì)算數(shù)組和指針大小的文章就介紹到這了,更多相關(guān)C語言sizeof strlen內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++生成不重復(fù)的隨機(jī)整數(shù)

    C++生成不重復(fù)的隨機(jī)整數(shù)

    這篇文章主要為大家詳細(xì)介紹了C++生成不重復(fù)的隨機(jī)整數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)

    VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn)

    這篇文章主要介紹了VS2019 更新MSDN并創(chuàng)建快捷方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 一文帶你探索C++中類型轉(zhuǎn)換的奧秘

    一文帶你探索C++中類型轉(zhuǎn)換的奧秘

    C++?提供了四種類型轉(zhuǎn)換方式,幫助我們在不同數(shù)據(jù)類型之間進(jìn)行有效的數(shù)據(jù)傳遞和操作,這些類型轉(zhuǎn)換方式在不同的場景下有各自的優(yōu)勢和適用性,下面我們就來深入了解一下吧
    2023-10-10
  • C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)

    C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)

    這篇文章主要介紹了C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn),幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C++ STL中的容器適配器實(shí)現(xiàn)

    C++ STL中的容器適配器實(shí)現(xiàn)

    這篇文章主要介紹了C++ STL中的容器適配器實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • C語言字符串替換:字符,字符串,字符數(shù)組詳解

    C語言字符串替換:字符,字符串,字符數(shù)組詳解

    這篇文章主要介紹了C++字符串替換的字符,字符串,字符數(shù)組,需要考慮的情況比較全面,有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C、C++線性表基本操作的詳細(xì)介紹

    C、C++線性表基本操作的詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于C、C++線性表基本操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C++ 構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼

    C++ 構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼

    本篇文章是對C++中構(gòu)造雙向鏈表的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • QT將char*轉(zhuǎn)QString的多種方法

    QT將char*轉(zhuǎn)QString的多種方法

    本文詳細(xì)介紹了在Qt中將char*轉(zhuǎn)換為QString的多種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • C語言?深入理解動(dòng)態(tài)規(guī)劃之計(jì)數(shù)類DP

    C語言?深入理解動(dòng)態(tài)規(guī)劃之計(jì)數(shù)類DP

    動(dòng)態(tài)規(guī)劃可謂是大名鼎鼎,筆試面試中的高頻考點(diǎn),也是重點(diǎn)難點(diǎn),動(dòng)態(tài)規(guī)劃類型題目靈活多變,難度系數(shù)也相對較高,往往我們做不好動(dòng)態(tài)規(guī)劃的題目就會(huì)與心儀的offer失之交臂,本篇文章我們就一起來研究一下動(dòng)態(tài)規(guī)劃的計(jì)數(shù)類DP
    2022-04-04

最新評(píng)論

双城市| 定州市| 修文县| 蓬莱市| 仪征市| 丹棱县| 积石山| 阳原县| 汕头市| 元谋县| 福泉市| 赤壁市| 平舆县| 富阳市| 香港 | 格尔木市| 资溪县| 琼结县| 聂拉木县| 大荔县| 阳春市| 高淳县| 博乐市| 普兰店市| 永登县| 高要市| 顺平县| 迁西县| 宁武县| 乌兰察布市| 永胜县| 阿拉尔市| 罗源县| 红安县| 丰顺县| 广安市| 英德市| 集安市| 瓮安县| 安国市| 株洲县|