什么是指针常量和常量指针?
在 C 语言中,指针是一种非常重要的数据类型,它存储了某个变量的地址,可以用来操作该变量。指针常量和常量指针是两种常见的指针类型,它们在指针的使用中有着不同的作用。
指针常量 int* const ptr;
表示存储的地址是不可变的,即不能改变指针的指向;常量指针 const int* ptr;
表示指向的值是不可变的,即不能通过该指针修改其指向的值。
指针常量和常量指针的区别
指针有四个属性:自身的值、自身的类型、指向的值和指向值的类型,而 const 修饰的无非就是自身的值和指向的值这两个属性。可以通过数组的特性来辅助记忆:
- 指针常量(地址常量)不能改变自身值,而可以改变其指向值;
- 常量指针反之,自身值可以改变,但不能通过指针改变指向的值。
指针常量和常量指针的应用
在 C 语言中,数组名的底层就是指针常量,通过运算符 A[x]
等价于 *(A+x)
,可以通过运算符 []
计算数组名这个指针常量与整数的加减来引用数组内的各个元素。
另外,如果要把一个变量的地址赋值给指针,若变量本身被 const 修饰,那么应该把地址赋值给常量指针,避免通过指针修改了变量本身。
下面是一个简单的 C 语言代码演示,用于说明指针常量和常量指针的用法:
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int* const ptr1 = &a;
const int* ptr2 = &b;
printf("a = %d, b = %d\n", a, b);
*ptr1 = 100;
printf("a = %d\n", a);
// ptr1 = &b; // error: assignment of read-only variable 'ptr1'
printf("b = %d\n", b);
// *ptr2 = 200; // error: assignment of read-only location '*ptr2'
ptr2 = &a;
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
该代码定义了两个整型变量 a
和 b
,分别初始化为 10 和 20。然后,定义了一个指针常量 ptr1
,它的值为 a
的地址;定义了一个常量指针 ptr2
,它的值为 b
的地址。接着,代码修改了 a
的值,但不能修改 ptr1
的指向;尝试修改 b
的值会报错,但可以修改 ptr2
的指向。最后,代码打印出 a
和 b
的值。
总结
指针常量和常量指针是 C 语言中两种常见的指针类型,它们在指针的使用中有着不同的作用。指针常量表示存储的地址是不可变的,即不能改变指针的指向;常量指针表示指向的值是不可变的,即不能通过该指针修改其指向的值。在使用指针时,应根据需要选择合适的类型,并注意指针的属性和限制,避免出现错误。