在 C 语言中,const
关键字可以用于修饰指针本身(即指针变量)或者指针指向的对象(即指针所指向的内存区域中的数据)。理解这两种用法之间的差别是非常重要的。
-
修饰指针本身(指针常量):
当const
修饰指针本身时,这个指针的值(即它所存储的地址)在初始化之后就不能被改变。这种指针被称为“指针常量”或“常指针”。int x = 10; int *const ptr = &x; // ptr 是一个指针常量,指向 x 的地址 // ptr = &y; // 错误:不能改变 ptr 的值
在上面的代码中,
ptr
是一个指针常量,它指向变量x
的地址。尝试改变ptr
的值(比如让它指向另一个变量y
的地址)将会导致编译错误。但是,我们可以通过ptr
来修改它所指向的对象x
的值。 -
修饰指针指向的对象(常量指针):
当const
修饰指针指向的对象时,这个指针可以用来指向一个常量对象(即该对象的内容不能被修改)。这种指针被称为“常量指针”或“指向常量的指针”。const int y = 20; const int *p = &y; // p 是一个常量指针,指向一个常量整数 // *p = 30; // 错误:不能通过 p 修改 y 的值
在上面的代码中,
p
是一个常量指针,它指向一个常量整数y
。尽管p
本身的值(即它所存储的地址)可以被改变以指向其他常量整数,但是尝试通过p
来修改它所指向的对象y
的值将会导致编译错误。 -
同时修饰指针和指针指向的对象:
当然,你也可以同时用const
修饰指针本身和指针指向的对象。const int z = 30; const int *const q = &z; // q 是一个指针常量,指向一个常量整数 // q = &anotherVar; // 错误:不能改变 q 的值 // *q = 40; // 错误:不能通过 q 修改 z 的值
在这个例子中,
q
是一个指针常量,指向一个常量整数z
。既不能改变q
的值,也不能通过q
来修改z
的值。
理解这些差别对于编写健壮且安全的 C 代码至关重要。在编写函数接口时,正确地使用 const
可以帮助避免意外的数据修改,从而提高代码的可读性和可维护性。