中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sizeof()與strlen()在C語言中有什么不同

發布時間:2020-12-01 15:00:59 來源:億速云 閱讀:194 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關sizeof()與strlen()在C語言中有什么不同,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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

sizeof()

1. sizeof()【操作數所占空間的字節數大小】是一種c中的基本運算符。

可以以類型、指針、數組和函數等作為參數。

頭文件類型為unsigned int。

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

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

sizeof()與strlen()在C語言中有什么不同

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

strlen

2.strlen()[計算字符串的長度]是一種函數。

'\0'作為終止符;

strlen的結果運行的時候才出來(不是編譯期求值),是計算字符串長度的。

其參數必須是字符型指針(char*)。

頭文件為#include<string.h>

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

sizeof()與strlen()在C語言中有什么不同

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

int main()
{
	char *p = "hello";
	char arr1 []= "hello";
	char arr2[] = { 'h', 'e', 'l', 'l', 'o' };
	printf("%d\n", sizeof( p));
	//結果4,因為指針變量的所占空間大小僅僅和操作系統位數有關32-4,64-8
	printf("%d\n", sizeof(arr1));
	//結果6,字符串默認以\0結尾,sizeof()包含\0的計算
	printf("%d\n", sizeof(arr2));
	//結果為5,因為為字符型表示,并不含有\0(僅僅字符串有\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'之后繼續向后讀取直到找到\0,所以是一個隨機值

sizeof()與strlen()在C語言中有什么不同

結果如上;

sizeof()與strlen()在C語言中有什么不同

設置為32位操作系統

后補一個注意事項:

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

sizeof()與strlen()在C語言中有什么不同

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

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

sizeof()與strlen()在C語言中有什么不同

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

2020年11月19日補充:

補充幾個題:

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

上述就是小編為大家分享的sizeof()與strlen()在C語言中有什么不同了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

密云县| 新竹县| 五华县| 金沙县| 鹤岗市| 左权县| 扶风县| 宣汉县| 洮南市| 股票| 麻城市| 家居| 金门县| 高要市| 明光市| 紫阳县| 邮箱| 沁源县| 鲁山县| 凤凰县| 吉木乃县| 阜新市| 金湖县| 隆安县| 冷水江市| 巫山县| 南丹县| 庆云县| 即墨市| 茶陵县| 湖州市| 桐城市| 昔阳县| 高要市| 奉贤区| 顺平县| 綦江县| 宣城市| 建水县| 扬州市| 雅安市|