Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Khác biệt giữa const char* p, char* const p, và const char* const p trong C


Con trỏ (Pointer)

Trong C, *p đại diện cho giá trị tại địa chỉ con trỏ, p là địa chỉ của giá trị đó.

const char* và char const*: con trỏ trỏ đến char hằng (constant char), giá trị char không thể thay đổi qua con trỏ này. Nhưng con trỏ p có thể trỏ đến char hằng khác.

char* const: con trỏ hằng trỏ đến char, giá trị char có thể thay đổi, nhưng con trỏ không thể trỏ sang địa chỉ khác.

const char* const: con trỏ hằng trỏ đến char hằng. Cả con trỏ và giá trị đều không thể thay đổi.

Quy tắc nhớ: Đọc cú pháp từ phải sang trái.

// con trỏ hằng trỏ đến char hằng
const char * const

// con trỏ hằng trỏ đến char
char * const

// con trỏ trỏ đến char hằng
const char *

Ví dụ (C)

Bỏ comment các dòng lỗi để xem lỗi biên dịch.

#include <stdio.h>

int main() {
    // Ví dụ: char const* (tương đương const char*)
    const char p = 'A';
    char const* q = &p;  // q trỏ đến char hằng

    // *q = 'B'; // LỖI: assignment of read-only location '*q'

    const char r = 'C';
    q = &r;  // OK: q có thể trỏ đến char hằng khác
    printf("%c\n", *q);

    // Ví dụ: char* const
    char u = 'D';
    char* const t = &u;  // t là con trỏ hằng
    *t = 'E';            // OK: thay đổi giá trị
    printf("%c", *t);

    // t = &r; // LỖI: assignment of read-only variable 't'

    // Ví dụ: const char* const
    char const* const s = &p;
    // *s = 'D'; // LỖI: không thay đổi được giá trị
    // s = &r;   // LỖI: không thay đổi được con trỏ

    return 0;
}

Kết quả đầu ra

C E