網站首頁 編程語言 正文
一、概念 ????????
sizeof:
sizeof操作符的結果類型為size_t,(它在頭文件用typedfe定義為unsigned int類型),計算的是分配空間的實際字節數。sizeof是運算符,可以以類型、函數、做參數 。
strlen:
strlen結果類型也為size_t(size_t strlen( const char *string )),但strlen是計算的空間中字符的個數(不包括‘\0’)。strlen是函數,只能以char*(字符串)做參數。而且,要想得到的結果正確必須包含 ‘\0’(通過strlen的實現得知)。
二、例題及解析
首先我們需要知道數組名的意義:
1.sizeof(數組名),這里的數組名表示整個數組,計算的是整個數組的大小。
2.&數組名,這里的數組名表示整個數組,取出的是整個數組的地址。
3.除此之外所有的數組名都表示首元素的地址。
2.1 一維數組
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a)); //16 a是整個數組的大小,sizeof計算出結果為16字節
printf("%d\n", sizeof(a+0)); //4 a是首元素的地址
printf("%d\n", sizeof(*a)); //4 首元素地址的解引用
printf("%d\n", sizeof(a+1)); //4 2的地址
printf("%d\n", sizeof(a[1])); //4
printf("%d\n", sizeof(&a)); //4 &a數組的地址,4個字節
printf("%d\n", sizeof(*&a)); //16 *和&抵消
printf("%d\n", sizeof(&a+1)); //4 4個字節的地址,跳過了4
printf("%d\n", sizeof(&a[0])); //4
printf("%d\n", sizeof(&a[0]+1)); //4
//總結: 只要是地址,不論什么類型,大小都為4個字節
2.2 字符數組
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr)); //6
printf("%d\n", sizeof(arr+0)); //4 首元素地址為4個字節
printf("%d\n", sizeof(*arr)); //1
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); //4
printf("%d\n", sizeof(&arr+1)); //4
printf("%d\n", sizeof(&arr[0]+1)); //4
printf("%d\n", strlen(arr)); //隨機值 strlen要找到\0才能返回數據的長度
printf("%d\n", strlen(arr+0)); //隨機值
printf("%d\n", strlen(*arr)); //err strlen(a)會把a的ASCII碼值97當作地址往后找
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //隨機值
printf("%d\n", strlen(&arr+1)); //隨機值
printf("%d\n", strlen(&arr[0]+1)); //隨機值
char arr[] = "abcdef";
printf("%d\n", sizeof(arr)); //7 arr是數組的地址
printf("%d\n", sizeof(arr + 0)); //4 arr是首元素的地址
printf("%d\n", sizeof(*arr)); //1
printf("%d\n", sizeof(arr[1])); //1
printf("%d\n", sizeof(&arr)); //4 數組的地址 4個字節
printf("%d\n", sizeof(&arr + 1)); //4
printf("%d\n", sizeof(&arr[0] + 1)); //4
printf("%d\n", strlen(arr)); //6
printf("%d\n", strlen(arr + 0)); //6
printf("%d\n", strlen(*arr)); //err
printf("%d\n", strlen(arr[1])); //err
printf("%d\n", strlen(&arr)); //6
printf("%d\n", strlen(&arr + 1)); //隨機值
printf("%d\n", strlen(&arr[0] + 1)); //5
char *p = "abcdef";
printf("%d\n", sizeof(p)); //4 p是指針變量,求指針變量的大小,為4個字節
printf("%d\n", sizeof(p + 1)); //4 p+1為b的地址
printf("%d\n", sizeof(*p)); //1
printf("%d\n", sizeof(p[0])); //1
printf("%d\n", sizeof(&p));; //4 指針p的地址
printf("%d\n", sizeof(&p + 1)); //4
printf("%d\n", sizeof(&p[0] + 1)); //4 b的地址
printf("%d\n", strlen(p)); //6
printf("%d\n", strlen(p + 1)); //5
printf("%d\n", strlen(*p)); //err strlen需要傳入地址
printf("%d\n", strlen(p[0])); //err
printf("%d\n", strlen(&p)); //隨機值
printf("%d\n", strlen(&p + 1)); //隨機值
printf("%d\n", strlen(&p[0] + 1)); //5 從b開始數
2.3 二維數組
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));
//48 二維數組中sizeof(a),a同樣表示整個數組
printf("%d\n", sizeof(a[0][0]));
//4
printf("%d\n", sizeof(a[0]));
//16 a[0]可看作第一行的數組名,sizeof(數組名)計算第一行數組大小
printf("%d\n", sizeof(a[0] + 1));
//4 a[0]表示第一行首元素地址,即a[0][0]地址,再+1為a[0][1]地址
printf("%d\n", sizeof(*(a[0] + 1)));
//4
printf("%d\n", sizeof(a + 1));
//4 a為第一行一維數組的地址,+1為第二行的地址
printf("%d\n", sizeof(*(a + 1)));
//16 第二行地址的解引用,是數組指針的解引用,訪問的是一個數組的大小
printf("%d\n", sizeof(&a[0] + 1));
//4 第一行地址+1,得第二行地址
printf("%d\n", sizeof(*(&a[0] + 1)));
//16 第二行的大小
printf("%d\n", sizeof(*a));
//16 第一行地址解引用是第一行的大小
printf("%d\n", sizeof(a[3]));
//16 計算第四行的大小(即使沒有第四行)
三、總結
這些都是來自往年的筆試題,非常重要!!!學廢了嗎?!
建議收藏反復閱讀思考,加深對指針、數組和內存的理解!!!
原文鏈接:https://blog.csdn.net/qq_43460230/article/details/123908433
相關推薦
- 2023-09-12 django數據庫篩選功能
- 2022-09-22 GoFrame garray使用實踐
- 2022-06-02 關于Python使用turtle庫畫任意圖的問題_python
- 2022-04-14 Python報mongod:?error?while?loading?shared?librarie
- 2022-08-30 C語言深入探究sizeof與整型數據存儲及數據類型取值范圍_C 語言
- 2023-05-23 Golang拾遺之實現一個不可復制類型詳解_Golang
- 2022-06-10 nginx.conf配置文件結構小結_nginx
- 2022-07-24 Python使用apscheduler模塊設置定時任務的實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支