C - sizeof 運算子

你好,未來的編程超級巨星!今天,我們將深入探究 C 編程語言中最有用的工具之一:sizeof 運算子。如果你是編程新手,別擔心——我會一步步引導你,就像我這些年來為無數學生做的那樣。所以,拿起你喜歡的飲料,放鬆身心,讓我們一起踏上這次令人興奮的冒險吧!

C - sizeof Operator

sizeof 運算子是什麼?

在我們進入範例之前,先來了解 sizeof 運算子是什麼。把它想成是電腦記憶體的卷尺。它告訴你特定數據類型或變量佔用了多少字節的記憶體。這個信息對於記憶體管理至關重要,並且能夠幫助你在程式中避免錯誤。

現在,讓我們通過各種範例來探索這個強大的運算子!

範例 1:在 C 中使用 sizeof 運算子

我們從一個簡單的範例開始,看看 sizeof 如何與不同的數據類型一起工作。

#include <stdio.h>

int main() {
printf("int 的大小:%zu 字節\n", sizeof(int));
printf("float 的大小:%zu 字節\n", sizeof(float));
printf("double 的大小:%zu 字節\n", sizeof(double));
printf("char 的大小:%zu 字節\n", sizeof(char));

return 0;
}

當你運行這段代碼時,你會看到類似的輸出:

int 的大小:4 字節
float 的大小:4 字節
double 的大小:8 字節
char 的大小:1 字節

這裡發生了什麼?我們使用 sizeof 來測量不同數據類型的記憶體大小。%zu 格式指定符用於 size_t 值,這是 sizeof 返回的類型。

記住,這些大小可能會根據你的電腦架構和編譯器而有所不同。這就像量鞋碼一樣——不同國家可能會有所不同!

範例 2:使用 sizeof 與結構

現在,我們升級一下,看看 sizeof 如何與結構一起工作。

#include <stdio.h>

struct Student {
char name[50];
int age;
float gpa;
};

int main() {
struct Student alice;
printf("Student 結構的大小:%zu 字節\n", sizeof(struct Student));
printf("alice 的大小:%zu 字節\n", sizeof(alice));

return 0;
}

這段代碼可能會輸出:

Student 結構的大小:60 字節
alice 的大小:60 字節

在這裡,我們創建了一個 Student 結構,包含名稱(50個字符)、年齡(int)和平均分(float)。sizeof 運算子告訴我們這個結構佔用的總記憶體。這就像量一個背包的大小,它包含了所有學生的信息!

範例 3:使用 sizeof 與數組

數組和 sizeof 是好朋友。讓我們看看它們一起工作的情況!

#include <stdio.h>

int main() {
int numbers[] = {1, 2, 3, 4, 5};
printf("numbers 數組的大小:%zu 字節\n", sizeof(numbers));
printf("一個元素的大小:%zu 字節\n", sizeof(numbers[0]));

return 0;
}

輸出:

numbers 數組的大小:20 字節
一個元素的大小:4 字節

在這個範例中,sizeof(numbers) 給我們數組的總大小(5個整數 * 4 字節每個 = 20 字節),而 sizeof(numbers[0]) 顯示單個元素的尺寸。

範例 4:使用 sizeof 來找出數組的長度

這裡有一個巧妙的小技巧——我們可以使用 sizeof 來計算數組中的元素數量!

#include <stdio.h>

int main() {
int numbers[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int length = sizeof(numbers) / sizeof(numbers[0]);

printf("數組有 %d 個元素\n", length);

return 0;
}

輸出:

數組有 10 個元素

我們將數組的總大小除以一個元素的尺寸。這就像計算一個披薩有多少片一樣,通過將總披薩大小除以一片的大小!

範例 5:在動態記憶體分配中使用 sizeof

sizeof 在動態記憶體分配中非常有用。讓我們看看如何:

#include <stdio.h>
#include <stdlib.h>

int main() {
int *arr;
int n = 5;

arr = (int*)malloc(n * sizeof(int));

if (arr == NULL) {
printf("記憶體分配失敗\n");
return 1;
}

printf("成功為 %d 個整數分配記憶體\n", n);

free(arr);
return 0;
}

輸出:

成功為 5 個整數分配記憶體

在這裡,我們使用 sizeof(int) 來確保我們為整數分配了正確的記憶體大小。這就像確保你有足夠的正確大小的容器來存儲你的 cookies!

範例 6:C 語言中指針的大小

最後,我們來看看指針:

#include <stdio.h>

int main() {
int *ptr_int;
char *ptr_char;
double *ptr_double;

printf("int 指針的大小:%zu 字節\n", sizeof(ptr_int));
printf("char 指針的大小:%zu 字節\n", sizeof(ptr_char));
printf("double 指針的大小:%zu 字節\n", sizeof(ptr_double));

return 0;
}

在 64 位系統上,你可能會看到:

int 指針的大小:8 字節
char 指針的大小:8 字節
double 指針的大小:8 字節

驚喜!所有指針的大小都是相同的,無論它們指向的數據類型是什麼。這就像城市中的地址一樣——地址的長度不會因為它指向的房子大小而改變!

結論

好了,我親愛的學生們!我們已經從各個角度探索了 sizeof 運算子。記住,sizeof 是你 C 編程世界中的信賴工具。它幫助你理解記憶體使用,避免錯誤,並寫出更高效的代碼。

在你繼續編程旅程的過程中,你會發現 sizeof 有無數的使用方式。持續練習,保持好奇心,並不要猶豫去嘗試。也許你會發現使用 sizeof 的新奇創意方法,即使是你的老師也未曾想到過的方法!

快樂編程,願 sizeof 伴你左右!??

Credits: Image by storyset