33、指针进阶5:指针与常量

厨子大约 2 分钟C语言基础程序程序厨

很多同学貌似经常弄混指针常量和常量指针的区别,主要是因为中文翻译的不是很好,你如果根据它的应为来理解就能方便一些,一个是常量指针(Pointer to Constant),另一个是指针常量(Constant Pointer),它们是两个完全不同的概念,其核心在于表示不同的内存访问权限。

下面详细介绍。

常量指针(Pointer to Constant)

常量指针是指指向常量的指针,即该指针指向的值不能被修改(通过该指针)。换句话说,你可以改变指针的指向,但不能通过该指针改变它所指向的值。

暂时无法在飞书文档外展示此内容

声明方式

const 数据类型 *指针名;
// 或者
数据类型 const *指针名;

示例代码

#include <stdio.h>

int main() {
    int a = 10;
    const int *ptr = &a;
    
    printf("ptr: %d\n", *ptr); // 输出: 10
    
    // *ptr = 20; // 错误:不能通过常量指针修改其指向的值
    
    int b = 30;
    ptr = &b; // 正确:常量指针可以改变其指向
    printf("ptr: %d\n", *ptr); // 输出: 30
    
    return 0;
}

指针常量(Constant Pointer)

指针常量是指指针本身是常量,即一旦初始化后,其指向的地址就不能再改变。但是,你可以通过该指针修改它所指向的值。

暂时无法在飞书文档外展示此内容

声明方式

数据类型 *const 指针名;

示例代码

#include <stdio.h>

int main() {
    int a = 10;
    int *const ptr = &a;
    
    printf("ptr: %d\n", *ptr); // 输出: 10
    
    *ptr = 20; // 正确:可以通过指针常量修改其指向的值
    printf("ptr: %d\n", *ptr); // 输出: 20
    
    // ptr = &b; // 错误:指针常量不能改变其指向
    
    return 0;
}

常量指针常量(Constant Pointer to Constant)

常量指针常量是指既指向常量又本身是常量的指针。即初始化之后,指针指向的地址及其指向的值均只能读取,不能修改。

暂时无法在飞书文档外展示此内容

声明方式

const 数据类型 *const 指针名;

示例代码

#include <stdio.h>

int main() {
    int a = 10;
    const int *const ptr = &a;
    
    printf("ptr: %d\n", *ptr); // 输出: 10
    
    // *ptr = 20; // 错误:不能通过常量指针常量修改其指向的值
    // ptr = &b; // 错误:不能改变常量指针常量的指向
    
    return 0;
}

总结

  • 常量指针(Pointer to Constant):可以改变指向,但不能通过该指针修改值。
  • 指针常量(Constant Pointer):不能改变指向,但可以通过该指针修改值。
  • 常量指针常量(Constant Pointer to Constant):既不能改变指向,也不能通过该指针修改值。