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

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

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

sizeof()和strlen()經常會被初學者混淆,但其中有有很大區(qū)別:

sizeof()

1. sizeof()【操作數所占空間的字節(jié)數大小】是一種c中的基本運算符。
可以以類型、指針、數組和函數等作為參數。
返回值類型為unsigned int

運算值在編譯的時候就出結果,所以可以用來定義數組維數。

char a[5]="123";
int b=sizeof(a);//b=5
int c=strlen(a);//c=3

sizeof()是一種單目操作符,是用來計算你所使用的操作數所占的空間字節(jié)大小。

// 證明返回無符號整形案例:
int i=0;
int main(){
	i--;
	if(i>sizeof(i)){
		printf(">");
	}else{
		printf("<");
	}
}

結果是>
i在main函數里為-1,由于sizeof(int)是無符號整形,c語言發(fā)生隱式類型轉換。會把-1直接看成有符號的數字,符號位會當做數字來算,是一個很大的值。

strlen

2.strlen()[計算字符串的長度]是一種函數。
'\0’作為終止符;
strlen的結果運行的時候才出來(不是編譯期求值),是計算字符串長度的。
其參數必須是字符型指針(char*)。
頭文件為#include<string.h>

size_t strlen(const char *str)//size_t()

在這里插入圖片描述

以下是一些具體的實例(vs2013 設置為32位):

int main()
{
	char *p = "hello";
	char arr1 []= "hello";
	char arr2[] = { 'h', 'e', 'l', 'l', 'o' };
	printf("%d\n", sizeof( p));
	//結果4,因為指針變量的所占空間大小僅僅和操作系統(tǒng)位數有關32-4,64-8
	printf("%d\n", sizeof(arr1));
	//結果6,字符串默認以\0結尾,sizeof()包含\0的計算
	printf("%d\n", sizeof(arr2));
	//結果為5,因為為字符型表示,并不含有\(zhòng)0(僅僅字符串有\(zhòng)0)
	printf("%d\n", strlen( p));
	//結果為5,strlen求的是字符串的長度,不包含\0
	printf("%d\n", strlen(arr1));
	//結果為5,strlen求的是字符串的長度,不包含\0
	printf("%d\n", strlen(arr2));
	//因為字符型不包含\0,但字符串需要找到\0才可結束,所以在'o'之后繼續(xù)向后讀取直到找到\0,所以是一個隨機值

程序運行結果如上

結果如上;

在這里插入圖片描述

設置為32位操作系統(tǒng)

補一個注意事項:

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};//整型數組
    printf("%d\n", sizeof(arr));
    return 0;
}

在這里插入圖片描述

注意數組的數據類型,char只占一個字節(jié),而int 數據類型四個字節(jié)哦,別忘了*4。前面的例子是char的。

#include <stdio.h>
int main()
{
    char arr[] = {1,2,(3,4),5};//字符型
    printf("%d\n", sizeof(arr));
    return 0;
}

在這里插入圖片描述

大量案例(想深入了解可以看)

補充幾個題:

1.(花括號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;
}

花括號定義不帶’\0’,所以求strlen就是未定義行為,所以就只有sizeof().

2.(花括號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;
}

花括號定義不帶’\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中類型不匹配是因為他們的數據類型不是char*.

4.(指針定義的sizeof()和strlen)

這個例題其實有點偏題了,涉及到指針和數組的隱式轉化(感興趣的可以去看我的博客–指針基礎總結詳解(里面有指針和數組的講解))

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中類型不匹配是因為他們的數據類型不是char*.

5.(花括號二維數組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] 轉成 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 是二維數組 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


到此這篇關于淺談C語言中的sizeof()和strlen()的區(qū)別的文章就介紹到這了,更多相關C語言 sizeof()和strlen()內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言修煉之路靈根孕育源流出?初識C言大道生下篇

    C語言修煉之路靈根孕育源流出?初識C言大道生下篇

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

    C++?BoostAsyncSocket實現異步反彈通信的案例詳解

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

    Linux環(huán)境下段錯誤的產生原因及調試方法小結

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

    詳解C++程序中定義struct結構體的方法

    C++中同樣擁有C語言中的結構體,下面就來詳解C++程序中定義struct結構體的方法,需要的朋友可以參考下
    2016-05-05
  • C++ OpenCV繪制幾何圖形

    C++ OpenCV繪制幾何圖形

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

    使用C語言實現內存池的示例代碼

    所謂內存池,顧名思義和線程池的設計原理是一樣的,為了減少頻繁申請釋放內存而帶來的資源消耗,減少釋放內存后產生的內存碎片,下面我們就來看看如何使用C語言實現內存池吧
    2024-02-02
  • 一篇文章帶你掌握C++虛函數的來龍去脈

    一篇文章帶你掌握C++虛函數的來龍去脈

    虛函數主要通過V-Table虛函數表來實現,該表主要包含一個類的虛函數的地址表,可解決繼承、覆蓋的問題,下面這篇文章主要給大家介紹了如何通過一篇文章帶你掌握C++虛函數的來龍去脈,需要的朋友可以參考下
    2022-10-10
  • C++數據結構之鏈表詳解

    C++數據結構之鏈表詳解

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

    C數據結構中串簡單實例

    這篇文章主要介紹了C數據結構中串簡單實例的相關資料,需要的朋友可以參考下
    2017-06-06
  • LZ77壓縮算法原理的理解

    LZ77壓縮算法原理的理解

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

最新評論

海林市| 含山县| 宁海县| 宝兴县| 东明县| 资阳市| 象山县| 商都县| 桑日县| 收藏| 廊坊市| 平遥县| 克山县| 淮南市| 涟水县| 荥阳市| 富宁县| 临海市| 秀山| 海兴县| 平乐县| 濮阳市| 介休市| 新巴尔虎右旗| 阿勒泰市| 股票| 瑞安市| 阿合奇县| 重庆市| 观塘区| 保亭| 武汉市| 宁安市| 盘山县| 宜君县| 辛集市| 永寿县| 固镇县| 黄陵县| 松原市| 紫云|