Dưới đây là bản dịch sang tiếng Việt của đoạn văn bản bạn đã cung cấp:

C - Misc Operators

# Hướng dẫn thân thiện về các toán tử khác nhau trong C

Xin chào các nhà lập trình tương lai! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị qua thế giới của các toán tử khác nhau trong C. Đừng lo lắng nếu bạn là người mới bắt đầu lập trình - tôi sẽ là người hướng dẫn thân thiện của bạn, giải thích mọi thứ từng bước một. Vậy, chúng ta cùng bắt đầu nhé!

## Toán tử sizeof trong C

Hãy tưởng tượng bạn đang chuẩn bị đi du lịch và bạn muốn biết mỗi món đồ chiếm bao nhiêu không gian. Đó chính là điều mà toán tử `sizeof` trong C làm - nó cho chúng ta biết kích thước của các thứ trong chương trình của chúng ta!

Toán tử `sizeof` trả về kích thước (tính bằng byte) của toán tử của nó. Dưới đây là cách bạn có thể sử dụng nó:

```c
#include <stdio.h>

int main() {
    int number = 42;
    char letter = 'A';

    printf("Kích thước của int: %zu byte\n", sizeof(int));
    printf("Kích thước của char: %zu byte\n", sizeof(char));
    printf("Kích thước của biến number: %zu byte\n", sizeof(number));
    printf("Kích thước của biến letter: %zu byte\n", sizeof(letter));

    return 0;
}

Khi bạn chạy đoạn mã này, bạn sẽ thấy gì đó như sau:

Kích thước của int: 4 byte
Kích thước của char: 1 byte
Kích thước của biến number: 4 byte
Kích thước của biến letter: 1 byte

Như bạn có thể thấy, sizeof có thể được sử dụng cả với các kiểu dữ liệu và các biến. Nó rất hữu ích khi bạn cần biết chính xác bộ nhớ mà dữ liệu của bạn đang sử dụng!

Toán tử địa chỉ trong C

Bây giờ, hãy nói về toán tử địa chỉ, được biểu thị bằng dấu ampersand (&). Hãy tưởng tượng bộ nhớ của máy tính của bạn như một tòa nhà lớn. Mỗi căn hộ (vị trí bộ nhớ) đều có địa chỉ riêng. Toán tử & giúp chúng ta tìm các địa chỉ này!

Dưới đây là một ví dụ đơn giản:

#include <stdio.h>

int main() {
    int age = 25;
    printf("Giá trị của age: %d\n", age);
    printf("Địa chỉ của age: %p\n", (void*)&age);

    return 0;
}

Đoạn mã này sẽ xuất ra gì đó như sau:

Giá trị của age: 25
Địa chỉ của age: 0x7ffd5e7e9994

Địa chỉ chính xác sẽ khác nhau trên máy tính của bạn, nhưng bạn đã hiểu ý rồi!

Toán tử truy cập trong C

Nếu toán tử địa chỉ (&) là về việc tìm nơi một thứ cư trú, thì toán tử truy cập (*) là về việc đến địa chỉ đó và xem có gì ở đó. Nó giống như nói, "Tôi có này địa chỉ, bên trong có gì?"

Hãy nhìn nó trong hành động:

#include <stdio.h>

int main() {
    int cookies = 5;
    int *p_cookies = &cookies;

    printf("Giá trị của cookies: %d\n", cookies);
    printf("Địa chỉ của cookies: %p\n", (void*)&cookies);
    printf("Giá trị của p_cookies: %p\n", (void*)p_cookies);
    printf("Giá trị tại *p_cookies: %d\n", *p_cookies);

    return 0;
}

Kết quả xuất ra:

Giá trị của cookies: 5
Địa chỉ của cookies: 0x7ffd5e7e9994
Giá trị của p_cookies: 0x7ffd5e7e9994
Giá trị tại *p_cookies: 5

Như bạn có thể thấy, *p_cookies cung cấp cho chúng ta giá trị lưu trữ tại địa chỉ được chỉ bởi p_cookies. Đó là hành động truy cập!

Toán tử tam phân trong C

Toán tử tam phân giống như một câu lệnh if-else rút gọn. Nó非常适合 khi bạn muốn gán một giá trị dựa trên một điều kiện. Dưới đây là cú pháp:

điều kiện ? giá_trị_nếu_thật : giá_trị_nếu_giả

Hãy nhìn một ví dụ:

#include <stdio.h>

int main() {
    int age = 20;
    char *status = (age >= 18) ? "người lớn" : "未成年";

    printf("Ở %d, bạn là một %s.\n", age, status);

    return 0;
}

Kết quả xuất ra:

Ở 20, bạn là một người lớn.

Thật tuyệt vời phải không? Nó giống như hỏi một câu hỏi và nhận một trong hai câu trả lời có thể!

Toán tử chấm (.) trong C

Toán tử chấm được sử dụng để truy cập các thành viên của một cấu trúc. Hãy tưởng tượng một cấu trúc như một容器 có thể chứa nhiều mục khác nhau của các loại khác nhau.

Dưới đây là một ví dụ:

#include <stdio.h>

struct Person {
    char name[50];
    int age;
};

int main() {
    struct Person john = {"John Doe", 30};

    printf("Tên: %s\n", john.name);
    printf("Tuổi: %d\n", john.age);

    return 0;
}

Kết quả xuất ra:

Tên: John Doe
Tuổi: 30

Chúng ta sử dụng toán tử chấm để truy cập nameage từ cấu trúc Person.

Toán tử chỉ hướng trong C

Toán tử chỉ hướng thực tế là cùng một toán tử truy cập (*) mà chúng ta đã thảo luận trước đó. Nó được gọi là "chỉ hướng" vì nó cho phép chúng ta truy cập gián tiếp một giá trị thông qua một con trỏ.

Dưới đây là một ví dụ phức tạp hơn một chút:

#include <stdio.h>

int main() {
    int x = 10;
    int *p = &x;
    int **pp = &p;

    printf("Giá trị của x: %d\n", x);
    printf("Giá trị của *p: %d\n", *p);
    printf("Giá trị của **pp: %d\n", **pp);

    return 0;
}

Kết quả xuất ra:

Giá trị của x: 10
Giá trị của *p: 10
Giá trị của **pp: 10

Ở đây, chúng ta đang sử dụng nhiều cấp độ chỉ hướng. pp là một con trỏ đến một con trỏ!

Và đó là tất cả! Chúng ta đã xem qua tất cả các toán tử khác nhau trong C. Nhớ rằng, thực hành là cách tốt nhất để hoàn thiện, vì vậy đừng ngần ngại thử nghiệm các toán tử này trong mã của riêng bạn. Chúc bạn lập trình vui vẻ!

Credits: Image by storyset