網站首頁 編程語言 正文
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
原文鏈接:https://blog.csdn.net/zhaocx111222333/article/details/109142273
相關推薦
- 2022-06-06 python可視化數據分析pyecharts初步嘗試_python
- 2022-06-16 Python實現視頻下載與合成的示例代碼_python
- 2022-09-25 自動微分----pytorch中的梯度運算與反向傳播函數(預備知識)
- 2022-04-20 Python設計模式創(chuàng)建型原型模式_python
- 2022-05-03 ASP.NET?Core基于滑動窗口實現限流控制_實用技巧
- 2023-05-22 shell腳本自動輸入用戶名和密碼的實現_linux shell
- 2022-08-02 Go語言resty?http包調用jenkins?api實例_Golang
- 2022-04-27 jquery+css實現移動端元素拖動排序_jquery
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支