C語言使用sizeof和strlen計算數(shù)組和指針大小
一、知識回顧
1、回顧sizeof()、strlen的作用
sizeof()
是用來求取 變量 或者 類型 所占內(nèi)存空間的大?。▎挝唬鹤止?jié))。- sizeof計算的是占用內(nèi)存空間的大小,單位是字節(jié),不關(guān)注內(nèi)存中到底存放的是什么。sizeof不是函數(shù),是操作符
strlen()
是一個庫函數(shù)是專門用來計算 字符串 長度的,在對其進(jìn)行調(diào)用前是需要包含頭文件<string.h>。- strlen()函數(shù)是通過字符串結(jié)束標(biāo)志 \0 來計算字符串長度的,但計算出來的字符串長度是不包括 \0 的,也就是說所謂的長度就是 \0 前字符的個數(shù)。strlen是函數(shù)
sizeof是一個運(yùn)算符,用于計算一個變量或數(shù)據(jù)類型所占的字節(jié)數(shù),不論變量中存儲的數(shù)據(jù)是否為空。而strlen是一個函數(shù),用于計算一個字符串中的字符數(shù),不包括字符串末尾的空字符'\0'。 另外,sizeof可以用于計算任意數(shù)據(jù)類型的大小,包括基本數(shù)據(jù)類型和自定義數(shù)據(jù)類型。 而strlen只能用于計算字符串的長度。 因此,sizeof通常用于確定數(shù)組所占的存儲空間,而strlen用于確定字符串的長度。
2、數(shù)組和指針
- 數(shù)組 - 能夠存放一組相同類型的元素,數(shù)組的大小取決于數(shù)組的元素個數(shù)和元素類型。
- 指針就是地址,大小都是4/8。(32位機(jī)器是4字節(jié),64位機(jī)器是8字節(jié))
3、數(shù)組名
大部分情況下數(shù)組名是首元素地址。
2個例外 sizeof(數(shù)組名) —— 數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小。(看數(shù)組名是否是單獨(dú)放在sizeof()里面) &數(shù)組名 ————-數(shù)組名表示整個數(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()計算的是占用內(nèi)存空間的大小,單位是字節(jié),不關(guān)注內(nèi)存中到底存放的是什么。
- strlen()是針對字符串的,求的是字符串的長度,本質(zhì)上統(tǒng)計的是
/0
之前出現(xiàn)的字符個數(shù)。
2、一維數(shù)組與一級指針
整型數(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)部 計算的是整個數(shù)組的大小。 printf("%d\n", sizeof(a + 0));// 4/8 //a + 0 a不是單獨(dú)放在sizeof()里面,則是數(shù)組首元素的地址,sizeof則是計算數(shù)組首元素地址的大小 printf("%d\n", sizeof(*a));//4 //a不是單獨(dú)放在sizeof()里面,則是數(shù)組首元素的地址 *a == a[0],sizeof()則是計算首元素的大小。 //*a -> *&a[0] -> a[0] printf("%d\n", sizeof(a + 1));// 4/8 //a不是單獨(dú)放在sizeof()里面,則是數(shù)組首元素的地址 -- int* //a+1 跳過1個整型,是第二個元素的地址 sizeof()是計算第二個元素地址的大小。 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 則要跳過一個數(shù)組。 printf("%d\n", sizeof(&a[0])); //取出首元素地址,sizeof計算的是元素的地址4/8 printf("%d\n", sizeof(&a[0]+1));//4/8 //取出的是第二個元素的地址,sizeof()計算的是地址的大小。
字符數(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ù)組首元素的地址 ,計算的大小為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ī)值 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));//整個數(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 跳過一個數(shù)組的地址,大小 4/8 printf("%d\n",sizeof(&arr[0]+1));//+1 跳過一個元素的地址,大小 4/8 //****************************************************************** printf("%d\n",strlen(arr));//arr表示首元素地址,計算得到數(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會被當(dāng)做地址,造成非法訪問 printf("%d\n",strlen(&arr));//&arr表示整個數(shù)組的大小,6 printf("%d\n",strlen(&arr+1));//數(shù)組的地址 +1后就找不到 /0 ,大小為隨機(jī)值 printf("%d\n",strlen(&arr[0]+1));//從第二個元素開始算,大小為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)); //解引用的一個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跳過一個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'開始計算
3、二維數(shù)組與二級指針
整型數(shù)組
int a[3][4]={0};//三行四列的數(shù)組 printf("%d\n",sizeof(a));//4*3*4=48 //a這個數(shù)組名單獨(dú)放在sizeof里面,表示整個數(shù)組,計算的是整個數(shù)組的大小 printf("%d\n",sizeof(a[0][0]));//第一行第一個元素,大小4字節(jié) printf("%d\n",sizeof(a[0]));//16 //a[0] 是第一行的數(shù)組名,這是數(shù)組名單獨(dú)放在sizeof內(nèi)部,計算的是第一行數(shù)組的大小 printf("%d\n",sizeof(a[0]+1));//4/8 //a[0]不是單獨(dú)放在sizeof內(nèi)部,表示的是首元素的地址。即第一行第一個元素的地址,相當(dāng)于&a[0][0] //a[0]+1 是第一行第二個元素的地址,相當(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],計算的是第二行的大小 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ù)組名表示整個數(shù)組,計算的是數(shù)組的大小。
&數(shù)組名,這里的數(shù)組名表示整數(shù)數(shù)組,取出的是整個數(shù)組的地址。
除此之外所有的數(shù)組名都表示首元素的地址。
到此這篇關(guān)于C語言使用sizeof和strlen計算數(shù)組和指針大小的文章就介紹到這了,更多相關(guān)C語言sizeof strlen內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++?MiniZip實(shí)現(xiàn)目錄壓縮與解壓的示例詳解
Zlib是一個開源的數(shù)據(jù)壓縮庫,提供了一種通用的數(shù)據(jù)壓縮和解壓縮算法,本文主要為大家詳細(xì)介紹了如何利用Zlib實(shí)現(xiàn)目錄壓縮與解壓,需要的小伙伴可以參考下2023-11-11C++中Copy-Swap實(shí)現(xiàn)拷貝交換
本文主要介紹了C++中Copy-Swap實(shí)現(xiàn)拷貝交換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C語言?智能指針?shared_ptr?和?weak_ptr
這篇文章主要介紹了C語言?智能指針?shared_ptr?和?weak_ptr,weak_ptr引入可以解決shared_ptr交叉引用時無法釋放資源的問題,下面來學(xué)習(xí)具體相關(guān)內(nèi)容吧,需要的朋友可以參考一下2022-04-04自己實(shí)現(xiàn)strcpy函數(shù)的實(shí)現(xiàn)方法
本篇文章介紹了,自己實(shí)現(xiàn)strcpy函數(shù)的實(shí)現(xiàn)方法。需要的朋友參考下2013-05-05