欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2023年11月10日 15:08:46   作者:威震江湖夢  
sizeof()一般是用來求取?變量?或者?類型?所占內(nèi)存空間的大小,strlen()是一個庫函數(shù)是專門用來計算?字符串?長度的,下面我們就來看看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)目錄壓縮與解壓的示例詳解

    C++?MiniZip實(shí)現(xiàn)目錄壓縮與解壓的示例詳解

    Zlib是一個開源的數(shù)據(jù)壓縮庫,提供了一種通用的數(shù)據(jù)壓縮和解壓縮算法,本文主要為大家詳細(xì)介紹了如何利用Zlib實(shí)現(xiàn)目錄壓縮與解壓,需要的小伙伴可以參考下
    2023-11-11
  • C語言關(guān)鍵字union的定義和使用詳解

    C語言關(guān)鍵字union的定義和使用詳解

    這篇文章主要介紹了C語言關(guān)鍵字union的定義和使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • C語言變量類型與輸出控制用法實(shí)例教程

    C語言變量類型與輸出控制用法實(shí)例教程

    這篇文章主要介紹了C語言變量類型與輸出控制用法,是C語言程序設(shè)計中比較基礎(chǔ)也是比較重要的用法,需要的朋友可以參考下
    2014-08-08
  • C++中Copy-Swap實(shí)現(xiàn)拷貝交換

    C++中Copy-Swap實(shí)現(xiàn)拷貝交換

    本文主要介紹了C++中Copy-Swap實(shí)現(xiàn)拷貝交換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • C++ 實(shí)現(xiàn)桶排序的示例代碼

    C++ 實(shí)現(xiàn)桶排序的示例代碼

    桶排序或所謂的箱排序,是一個排序算法,工作的原理是將數(shù)組分到有限數(shù)量的桶子,本文詳細(xì)的介紹了如何實(shí)現(xiàn),感興趣的可以了解一下
    2021-07-07
  • C++使用jsoncpp庫解析Json

    C++使用jsoncpp庫解析Json

    對json的解析操作是我們?nèi)粘i_發(fā)中經(jīng)常會遇到的一個需求,下面這篇文章主要給大家介紹了關(guān)于C++使用jsoncpp庫解析Json的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • C++中繼承基類與派生類的區(qū)別

    C++中繼承基類與派生類的區(qū)別

    這篇文章主要介紹了C++中繼承基類與派生類的區(qū)別,面向?qū)ο蟪绦蛟O(shè)計中最重要的一個概念是繼承。繼承允許我們依據(jù)另一個類來定義一個類,這使得創(chuàng)建和維護(hù)一個應(yīng)用程序變得更容易,需要的朋友可以參考下
    2023-05-05
  • C++使用ImGUI框架開發(fā)一個簡單程序

    C++使用ImGUI框架開發(fā)一個簡單程序

    ImGui?是一個用于C++的用戶界面庫,跨平臺、無依賴,支持OpenGL、DirectX等多種渲染API,下面就跟隨小編一起學(xué)習(xí)一下如何使用ImGUI框架開發(fā)一個簡單程序吧
    2023-08-08
  • C語言?智能指針?shared_ptr?和?weak_ptr

    C語言?智能指針?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)方法

    本篇文章介紹了,自己實(shí)現(xiàn)strcpy函數(shù)的實(shí)現(xiàn)方法。需要的朋友參考下
    2013-05-05

最新評論