C - Operator sizeof

Xin chào các ngôi sao lập trình tương lai! Hôm nay, chúng ta sẽ cùng tìm hiểu một trong những công cụ hữu ích nhất trong ngôn ngữ lập trình C: toán tử sizeof. Đừng lo lắng nếu bạn mới bắt đầu học lập trình - tôi sẽ hướng dẫn bạn từng bước, giống như tôi đã làm cho hàng trăm học sinh trong những năm dạy học của mình. Vậy hãy lấy饮料 yêu thích của bạn, thư giãn và cùng nhau bắt đầu cuộc phiêu lưu thú vị này!

C - sizeof Operator

什么是 sizeof Toán tử?

Trước khi chúng ta vào các ví dụ, hãy hiểu sizeof toán tử là gì. Hãy tưởng tượng nó như một thước đo bộ nhớ của máy tính. Nó cho bạn biết một kiểu dữ liệu hoặc biến cụ thể chiếm bao nhiêu byte bộ nhớ. Thông tin này rất quan trọng cho quản lý bộ nhớ và có thể giúp ngăn ngừa lỗi trong chương trình của bạn.

Bây giờ, hãy cùng khám phá toán tử mạnh mẽ này thông qua nhiều ví dụ!

Ví dụ 1: Sử dụng sizeof Toán tử trong C

Hãy bắt đầu với một ví dụ đơn giản để xem sizeof hoạt động như thế nào với các kiểu dữ liệu khác nhau.

#include <stdio.h>

int main() {
printf("Kích thước của int: %zu byte\n", sizeof(int));
printf("Kích thước của float: %zu byte\n", sizeof(float));
printf("Kích thước của double: %zu byte\n", sizeof(double));
printf("Kích thước của char: %zu byte\n", sizeof(char));

return 0;
}

Khi bạn chạy đoạn mã này, bạn sẽ thấy đầu ra tương tự như này:

Kích thước của int: 4 byte
Kích thước của float: 4 byte
Kích thước của double: 8 byte
Kích thước của char: 1 byte

Điều gì đang xảy ra ở đây? Chúng ta đang sử dụng sizeof để đo kích thước bộ nhớ của các kiểu dữ liệu khác nhau. Định dạng %zu được sử dụng cho giá trị size_t, đó là gì sizeof trả về.

Nhớ rằng, các kích thước này có thể thay đổi tùy thuộc vào kiến trúc máy tính và bộ编译器. Nó giống như đo尺寸 giày - chúng có thể khác nhau giữa các quốc gia!

Ví dụ 2: Sử dụng sizeof với Struct

Bây giờ, hãy nâng cấp và xem sizeof hoạt động như thế nào với cấu trúc.

#include <stdio.h>

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

int main() {
struct Student alice;
printf("Kích thước của struct Student: %zu byte\n", sizeof(struct Student));
printf("Kích thước của alice: %zu byte\n", sizeof(alice));

return 0;
}

Đoạn mã này có thể đầu ra:

Kích thước của struct Student: 60 byte
Kích thước của alice: 60 byte

Ở đây, chúng ta đã tạo một cấu trúc Student với tên (50 ký tự), tuổi (int) và GPA (float). Toán tử sizeof cho chúng ta biết tổng bộ nhớ chiếm bởi cấu trúc này. Nó giống như đo尺寸 của một balo chứa tất cả thông tin của sinh viên!

Ví dụ 3: Sử dụng sizeof với Mảng

Mảng và sizeof là bạn tốt. Hãy xem chúng trong hành động!

#include <stdio.h>

int main() {
int numbers[] = {1, 2, 3, 4, 5};
printf("Kích thước của mảng numbers: %zu byte\n", sizeof(numbers));
printf("Kích thước của một phần tử: %zu byte\n", sizeof(numbers[0]));

return 0;
}

Đầu ra:

Kích thước của mảng numbers: 20 byte
Kích thước của một phần tử: 4 byte

Trong ví dụ này, sizeof(numbers) cho chúng ta biết tổng kích thước của mảng (5 số nguyên * 4 byte mỗi số = 20 byte), trong khi sizeof(numbers[0]) cho biết kích thước của một phần tử.

Ví dụ 4: Sử dụng sizeof để Tìm Độ Dài của Mảng

Đây là một mẹo hay - chúng ta có thể sử dụng sizeof để tính số lượng phần tử trong một mảng!

#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("Mảng có %d phần tử\n", length);

return 0;
}

Đầu ra:

Mảng có 10 phần tử

Chúng ta đang chia tổng kích thước của mảng cho kích thước của một phần tử. Nó giống như xác định số lượng lát trong một pizza bằng cách chia tổng kích thước pizza cho尺寸 của một lát!

Ví dụ 5: Sử dụng sizeof trong Phân Cấp 内存 动态

sizeof rất hữu ích khi phân cấp bộ nhớ động. Hãy xem như thế nào:

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

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

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

if (arr == NULL) {
printf("Phân cấp bộ nhớ thất bại\n");
return 1;
}

printf("Thành công phân cấp bộ nhớ cho %d số nguyên\n", n);

free(arr);
return 0;
}

Đầu ra:

Thành công phân cấp bộ nhớ cho 5 số nguyên

Ở đây, chúng ta sử dụng sizeof(int) để đảm bảo chúng ta phân cấp đúng lượng bộ nhớ cho các số nguyên. Nó giống như đảm bảo bạn có đủ容器 đúng kích thước để lưu trữ bánh quy của bạn!

Ví dụ 6: Kích thước của một Pointer trong C

Cuối cùng, hãy xem xét các con trỏ:

#include <stdio.h>

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

printf("Kích thước của con trỏ int: %zu byte\n", sizeof(ptr_int));
printf("Kích thước của con trỏ char: %zu byte\n", sizeof(ptr_char));
printf("Kích thước của con trỏ double: %zu byte\n", sizeof(ptr_double));

return 0;
}

Trên hệ thống 64-bit, bạn có thể thấy:

Kích thước của con trỏ int: 8 byte
Kích thước của con trỏ char: 8 byte
Kích thước của con trỏ double: 8 byte

Ngạc nhiên! Tất cả các con trỏ đều có cùng kích thước, bất kể kiểu dữ liệu chúng chỉ đến. Nó giống như địa chỉ trong một thành phố - chiều dài của địa chỉ không thay đổi dựa trên kích thước của ngôi nhà nó chỉ đến!

Kết luận

Và thế là bạn đã có nó, các em học sinh yêu quý! Chúng ta đã khám phá toán tử sizeof từ nhiều góc độ khác nhau. Nhớ rằng, sizeof giống như thước đo tin cậy của bạn trong thế giới lập trình C. Nó giúp bạn hiểu sử dụng bộ nhớ, tránh lỗi và viết mã hiệu quả hơn.

Trong hành trình lập trình của bạn, bạn sẽ tìm thấy vô số cách sử dụng toán tử này. Hãy tiếp tục thực hành, giữ sự tò mò và đừng ngần ngại thử nghiệm. Ai biết được? Bạn có thể khám phá ra những cách sử dụng mới và sáng tạo cho sizeof mà ngay cả giáo viên cũ của bạn cũng chưa nghĩ ra!

Chúc các bạn lập trình vui vẻ, và may mắn với sizeof! ??

Credits: Image by storyset