Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

ความแตกต่างระหว่าง const char* p, char * const p, และ const char * const p ในภาษา C

Pointer

ในภาษา C ตัวดำเนินการ *p แทนค่าที่จัดเก็บใน pointer และ p แทนที่อยู่ของค่า เรียกว่า pointer

const char* และ char const* หมายถึง pointer ชี้ไปยัง char แบบคงที่ (constant) และค่าของ char ที่ถูกชี้ไม่สามารถเปลี่ยนได้ แต่สามารถเปลี่ยนค่าของ pointer เองได้ (ชี้ไปยัง constant char อื่นได้)

char* const หมายถึง pointer ชี้ไปยัง char และค่าของ char ที่ถูกชี้สามารถเปลี่ยนได้ แต่ไม่สามารถเปลี่ยนค่าของ pointer เองได้ (เป็น constant ไม่สามารถชี้ไปยัง char อื่นได้)

const char* const หมายถึง pointer ชี้ไปยัง constant char และค่าของ char ที่ถูกชี้ไม่สามารถเปลี่ยนได้ และไม่สามารถเปลี่ยนค่าของ pointer เองได้ (ชี้ไปยัง constant char อื่นไม่ได้)

กฎขมือ: อ่านไวยากรณ์จากขวาไปซ้าย

// constant pointer to constant char
const char * const
// constant pointer to char
char * const
// pointer to constant char
const char *

ตัวอย่าง (C)

ลองเอาโค้ดที่คอมเมนต์ไว้ (บรรทัดที่ error) ออกมาจะเห็น error

#include <stdio.h>

int main() {
    // Example: char const*
    // Note: char const* เหมือน const char*
    const char p = 'A';
    // q is a pointer to const char
    char const* q = &p;
    // Invalid assignment
    // value of p cannot be changed
    // error: assignment of read-only location '*q'
    // *q = 'B';
    const char r = 'C';
    // q can point to another const char
    q = &r;
    printf("%c\n", *q);
    
    // Example: char* const
    char u = 'D';
    char * const t = &u;
    // Can change the value
    *t = 'E';
    printf("%c", *t);
    // Invalid assignment
    // t cannot be changed
    // error: assignment of read-only variable 't'
    // t = &r;
    
    // Example: char const* const
    char const* const s = &p;
    // Invalid assignment
    // value of s cannot be changed
    // error: assignment of read-only location '*s'
    // *s = 'D';
    // Invalid assignment
    // s cannot be changed
    // error: assignment of read-only variable 's'
    // s = &r;
    return 0;
}

เอาต์พุต

C E