首页 > 编程笔记 > C语言笔记(精华版)

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 指向的值,但不能修改它。这种设计可以增加函数的安全性和可靠性。
 

总的来说,常量指针本身的指向可以被修改,但是它所指向的内容不能被修改,这使得我们可以更精确地控制数据的访问和修改权限,从而编写出更安全、更可靠的代码。

相关文章