C语言常量指针的概念和用法(附带示例)
C语言中的常量指针是一个比较常见的概念,这意味着,指针指向的内容(也就是指针所指向的内存中的值)是常量,该内容在初始化以后不能再被修改。但是,指针本身不是常量,它的指向可以被随时被修改。
要理解常量指针,我们首先需要明确指针的两个重要属性:指针本身的值(即它所存储的地址)和指针所指向的值。常量指针的“常量”,是针对它指向的值而言的,而不是针对它本身的值。这意味着我们可以改变常量指针本身的指向,但是却不能通过常量指针修改它所指向的值。
常量指针的声明格式有两种:
const 数据类型 *指针变量名; 数据类型 const *指针变量名;
在这个声明中,const 关键字可以位于数据类型
之前,可以位于数据类型
之后,但是必须要位于星号*
之前,这样才能保证 const 修饰的是指针变量所指向的值。如果把 const 放在 * 后面,也就是写作:
数据类型 * const 指针变量名;
那么就变成了指针常量,此时 const 用来修饰指针变量本身。这意味着,指针变量本身是常量,它的指向在初始化以后就不能被修改了;然而,指针变量所指向的内容却不是常量,内容可以随时被修改。
如果你想深入了解指针常量和常量指针的区别,请转到:C语言指针常量和常量指针的区别(附带示例)
总之,const 离谁近就用来修饰谁。
让我们通过一个具体的例子来理解常量指针的概念和用法:
#include <stdio.h> int main() { int x = 10; const int *ptr = &x; printf("x 的值: %d\n", x); printf("ptr 指向的值: %d\n", *ptr); // 下面这行代码会导致编译错误 // *ptr = 20; x = 20; // 这是允许的 printf("修改后 x 的值: %d\n", x); printf("修改后 ptr 指向的值: %d\n", *ptr); return 0; }
在这个例子中,我们声明了一个整型变量 x 和一个指向常量整型的指针 ptr;ptr 被初始化为指向 x。虽然 ptr 指向的是 x,但是由于 ptr 是常量指针,我们不能通过 ptr 来修改 x 的值。如果尝试通过 ptr 修改 x 的值(如注释掉的那行代码),编译器会报错。
然而,需要注意的是,x 本身并不是常量。我们仍然可以直接修改 x 的值,这种修改是允许的。当我们修改 x 的值后,通过 ptr 读取的值也会随之改变,因为 ptr 仍然指向 x。
输出结果:
x 的值: 10 ptr 指向的值: 10 修改后 x 的值: 20 修改后 ptr 指向的值: 20
常量指针的一个重要应用是在函数参数中。当我们希望函数可以访问某个变量的值,但不希望函数修改这个变量时,就可以使用常量指针作为参数。这样可以有效地保护数据,防止意外的修改。例如:
void printValue(const int *ptr) { printf("值: %d\n", *ptr); // *ptr = 100; // 这行代码会导致编译错误 }
在这个函数中,参数 ptr 是一个指向常量整型的指针,函数可以读取 ptr 指向的值,但不能修改它。这种设计可以增加函数的安全性和可靠性。
总的来说,常量指针本身的指向可以被修改,但是它所指向的内容不能被修改,这使得我们可以更精确地控制数据的访问和修改权限,从而编写出更安全、更可靠的代码。