Computer >> Máy Tính >  >> Lập trình >> lập trình C

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

Con trỏ

Trong ngôn ngữ lập trình C, * p đại diện cho giá trị được lưu trữ trong một con trỏ và p đại diện cho địa chỉ của giá trị, được gọi là một con trỏ.

const char * char const * nói rằng con trỏ có thể trỏ đến một char không đổi và giá trị của char được trỏ bởi con trỏ này không thể thay đổi. Nhưng chúng ta có thể thay đổi giá trị của con trỏ vì nó không phải là hằng số và nó có thể trỏ đến một hằng số char khác.

char * const nói rằng con trỏ có thể trỏ đến một char và giá trị của char được trỏ bởi con trỏ này có thể được thay đổi. Nhưng chúng ta không thể thay đổi giá trị của con trỏ vì nó không đổi và nó không thể trỏ đến một char khác.

const char * const nói rằng con trỏ có thể trỏ đến một char không đổi và giá trị của int được trỏ bởi con trỏ này không thể thay đổi. Và chúng ta không thể thay đổi giá trị của con trỏ cũng như nó bây giờ là hằng số và nó không thể trỏ đến một hằng số char khác.

Quy tắc ngón tay cái là đặt tên theo cú pháp từ phải sang trái.

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

Ví dụ (C)

Bỏ ghi chú các mã không liên quan đã nhận xét và xem lỗi.

#include <stdio.h>
int main() {
   //Example: char const*
   //Note: char const* is same as const char*
   const char p = 'A';
   // q is a pointer to const char
   char const* q = &p;
   //Invalid asssignment
   // 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;
   //You can change the value
   *t = 'E';
   printf("%c", *t);
   // Invalid asssignment
   // t cannot be changed
   // error: assignment of read-only variable 't'
   //t = &r;
   //Example: char const* const
   char const* const s = &p;
   // Invalid asssignment
   // value of s cannot be changed
   // error: assignment of read-only location '*s'
   // *s = 'D';
   // Invalid asssignment
   // s cannot be changed
   // error: assignment of read-only variable 's'
   // s = &r;
   return 0;
}

Đầu ra

C
E