sizeof 和 strlen 計算陣列大小和長度詳解
sizeof
首先 sizeof 並非為一個函式,而是C語言中的一個關鍵字。
sizeof 計算物件所佔記憶體的大小,也就是空間大小,它不存在 ‘\0’,也不會去找’\0’,所以不受其影響, 判斷運算元的型別長度,以位元組為單位;
指標在32位系統佔4個位元組,在64位系統佔8個位元組,本例項都在32位機器上操作。
sizeof 求大小看的僅僅是它的型別大小,而非其他。所以我們在計算時只要認清楚它的型別大小就行。
arr 和 &arr 的區別.
int arr[10] = { 0 );
arr -> 本意為陣列arr 的第一個元素的地址,但是在 sizeof (arr) 中被特殊化為求整個陣列 arr 的大小(這是一個特例),所以 sizeof (arr) = 40;
&arr -> 意思為整個陣列的記憶體地址,所以 sizeof (&arr) = 4;(因為它是一個陣列指標)
arr + 1 和 &arr + 1 的區別
arr 為首元素的地址 *,arr + 1 -> 即加了一個int * (4)的大小.
&arr 為陣列的地址, 陣列的地址 + 1 -> 即跳過了整個陣列的大小,所以相當於加了 40;
<1>
char arr[] = { 'a', 'b', 'c', 'd' };
1. printf("%d\n", sizeof(arr)); //4
2. printf("%d\n", sizeof(arr + 0)); //4
3. printf("%d\n", sizeof(*arr)); //1
4. printf("%d\n", sizeof(arr + 1)); //4
5. printf("%d\n", sizeof(arr[1])); //1
6. printf("%d\n", sizeof(&arr)); //4
7. printf("%d\n", sizeof(*&arr)); //4
8. printf("%d\n", sizeof(&arr + 1)); //4
9. printf("%d\n", sizeof(&arr[0])); //4
10. printf("%d\n", sizeof(&arr[0] + 1)); //4
- 整個陣列的大小(特例)= 4
- 陣列首元素的地址,型別為 char* = 4
- 陣列首元素,型別為 char = 1
- 陣列第二個元素的地址, 型別為 char* = 4
- 同3
- 陣列的地址,型別為char (*) [4] = 4
- 先求陣列地址,在解應用,相當於求陣列大小,同1
- 取陣列地址再 + 1 ,相當於跳過整個陣列,型別為 char (*)[4] = 4
- 陣列首元素的地址, 型別為 char * = 4
- 陣列第二個元素的地址,型別為 char * = 4
<2>
char arr[] = "abcd";
printf("%d\n", sizeof(arr)); //5
printf("%d\n", sizeof(*&arr)); //5
別忘了這種初始化模式系統會預設給末尾補一個 ‘\0’,所以是5, 其他的和<1> 是一樣的。
strlen
strlen 是庫函式,使用時須引用其標頭檔案 <string.h>
它存在 ‘\0’,會去找’\0’,所以會受到 '\0’的影響
它的格式為 size_t strlen(const char * str); (必須傳 const char * 型別的指標)
<1>
char arr[] = { 'a', 'b', 'c', 'd' };
char arr[] = { 'a', 'b', 'c', 'd', '\0' }; //自己新增 '\0'
1. printf("%d\n", strlen(arr)); // 隨機值
2. printf("%d\n", strlen(arr + 0)); //隨機值
3. printf("%d\n", strlen(*arr)); //型別不匹配
4. printf("%d\n", strlen(arr[1])); //型別不匹配
5. printf("%d\n", strlen(&arr)); //型別不匹配
6. printf("%d\n", strlen(&arr + 1)); //型別不匹配
7. printf("%d\n", strlen(&arr[0] + 1)); //隨機值
出現隨機值的原因是這樣定義的陣列後面沒有 ‘\0’,,所以 strlen 不能精確判斷結束條件,有可能在超出陣列很多後才停止。要想避免上述情況,建議用下面的方式進行初始化,或者自己在字元末尾加上 ‘\0’, 加上後的效果和 <2> 是一樣的.
<2>
char arr[] = "abcd";
1. printf("%d\n", strlen(arr)); // 4
2. printf("%d\n", strlen(arr + 0)); //4
3. printf("%d\n", strlen(*arr)); //型別不匹配
4. printf("%d\n", strlen(arr[1])); //型別不匹配
5. printf("%d\n", strlen(&arr)); //型別不匹配
6. printf("%d\n", strlen(&arr + 1)); //型別不匹配
7. printf("%d\n", strlen(&arr[0] + 1)); // 3
這種定義方式系統會自動在字串的末尾位置新增 ‘\0’,所以不會出現隨機值的問題。
相關文章
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- 求陣列長度的兩種方法,以及區別(strlen sizeof)陣列
- c語言的strlen函式計算字元陣列長度不對C語言函式字元陣列
- c語言中計算陣列長度的方法C語言陣列
- C語言如何計算陣列的長度C語言陣列
- PHP陣列學習之計算陣列元素總和PHP陣列
- 1588 所有奇數長度子陣列的和(字首和)陣列
- sizeof與strlen的區別
- C++ 獲取陣列大小、多維陣列操作詳解C++陣列
- Kotlin 控制流和陣列操作詳解Kotlin陣列
- Golang切片和陣列底層詳解Golang陣列
- 65.C指標---sizeof()函式和strlen()函式常見考指標函式
- MyBatis陣列與集合判斷非空和長度MyBatis陣列
- C++ Break、Continue 和 陣列操作詳解C++陣列
- Java break、continue 詳解與陣列深入解析:單維陣列和多維陣列詳細教程Java陣列
- C指標和陣列的關係詳解指標陣列
- 【譯】在 JavaScript 中建立和填充任意長度的陣列JavaScript陣列
- C++陣列長度C++陣列
- 字元陣列的長度字元陣列
- lLeeCode最優題解收錄:1588.所有奇數長度子陣列的和陣列
- c語言中sizeof詳解C語言
- 矩陣和陣列矩陣陣列
- Java 定義長度為 0 的陣列 / 空陣列Java陣列
- C# sizeof 計算規則C#
- Javascript - 陣列和陣列的方法JavaScript陣列
- numpy——陣列的計算陣列
- 陣列和字串陣列字串
- js陣列方法詳解JS陣列
- 樹狀陣列詳解陣列
- python輸入詳解(陣列、矩陣)Python陣列矩陣
- C++獲取陣列的長度C++陣列
- 203. 長度最小的子陣列陣列
- Javascript如何改變陣列的長度?JavaScript陣列
- 詳解資料結構中的“陣列”與程式語言中的“陣列”的區別和聯絡資料結構陣列
- Python有 n 個物品和一個大小為 m 的揹包. 給定陣列 A 表示每個物品的大小和陣列 V 表示每個物品的價值.。。Python陣列
- JavaScript遍歷陣列詳解JavaScript陣列
- 切片底層陣列詳解陣列
- 二維陣列和稀疏陣列互轉陣列