C语言中的const
定义
const 将修饰离它最近
的对象(优先左边)
解释
Bjarne 在他的《The C++ Programming Language》里面给出过一个助记的方法
1
“以 * 分界,把一个声明从右向左读”。
注意语法,* 读作 pointer to (指向…的指针),const (常量) 是形容词,char (变量类型) 和 p (变量名) 当然都是名词。
const char * p
读作:p is a pointer to a const char,译:p 是一个指针(变量)
,它指向一个常量字符(const char)
。就是 p 能修改,p 指向内容不能修改char * const p
读作:p is a const pointer to a char,译:p 是一个常量指针(const p)
,它指向一个字符(变量)
。就是 p 不能修改,p 指向内容能修改
其他情况
另外请再注意下面的情况:
先看
const int a
和int const a
,这里没有分界符 *,虽然 const 的位置不同,但意思不变,它 const 修饰的是 int,常量整数。再看
const char * p
和char const * p
,首先以 * 分界,虽然 const 的位置改变了,但它都是在修饰 char,常量字符。const char * const p
就表示常量指针指向的常量字符
扩展
const char a[]
和 const char *a
和 const char *a[3]
const char a[]
中的 a 表示 a 一个字符数组,是个数组类型的变量,大小和数组占用空间相同。a 不可修改,也就是内容不可修改const char *a
中的 a 表示指向字符的指针(对于字符数组就是指向数组第一个字符的指针),大小就是一个指针。指针可以修改,指针指向的内容不可修改const char *a[3]
中的 a 表示一个指针数组,数组包含 3 个指针,这些指针都指向字符,大小是 3 个指针大小。对于每个指针,该指针为非const,可修改,但其指向的内容为const,不可修改(相当于const char *a
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
const char a[] = "abcdefghijkl";
const char *b = "ijklmnopqrst";
const char *c[3];
printf("sizeof(a) = %d\n",(int)sizeof(a));
// sizeof(a) = 13
printf("sizeof(b) = %d\n",(int)sizeof(b));
// sizeof(b) = 8
printf("sizeof(c) = %d\n",(int)sizeof(c));
// sizeof(c) = 24
printf("c[0]:%p,c[1]:%p,c[2]:%p\n",c[0],c[1],c[2]);
// c[0]:(nil),c[1]:(nil),c[2]:(nil)
return 0;
}
参考
本文由作者按照 CC BY 4.0 进行授权