C和C++中,const 关键字用于声明常量变量,但它的位置可以影响它所修饰的内容。const 关键字的使用在指针和指针指向的内容时,可能会导致混淆。const 关键字的位置决定了它修饰的是指针本身还是指针指向的内容。const int * 表示指向常量的指针,而 int * const 表示常量指针。可以同时使用 const int * const 来表示一个常量指针,它指向常量数据,即指针的地址和指向的值都不能改变。

1、const int 和 int const

两种写法是完全等价的,都表示一个常量整数,也就是说,该变量的值不能被改变。const int a int const b 是等价的,ab 都是常量整数,不能修改其值。

#include <stdio.h>

int main() {
    const int a = 10;    // 使用 const int 声明常量整型
    int const b = 20;    // 使用 int const 声明常量整型

    printf("a = %d, b = %d\n", a, b);

    // 以下语句会产生编译错误,因为常量值不能被修改
    // a = 15; // 错误:尝试修改常量
    // b = 25; // 错误:尝试修改常量

    return 0;
}

2、const int * 和 int const *

两种写法也是等价的,表示指向常量整数的指针。也就是说,指针指向的内容是常量,不能通过该指针修改该内容,但可以改变指针本身,使其指向其他位置。

#include <stdio.h>

int main() {
    int x = 10;
    int y = 20;

    // const int * 和 int const * 是等价的
    const int *ptr1 = &x;    // 指向常量整数的指针
    int const *ptr2 = &y;    // 同样是指向常量整数的指针

    printf("ptr1 points to value: %d\n", *ptr1);  // 输出: 10
    printf("ptr2 points to value: %d\n", *ptr2);  // 输出: 20

    // 尝试通过指针修改值(会报错)
    // *ptr1 = 15;  // 错误,不能通过 ptr1 修改 x 的值
    // *ptr2 = 25;  // 错误,不能通过 ptr2 修改 y 的值

    // 指针本身可以指向其他地址
    ptr1 = &y;    // 合法,指针可以改变指向
    printf("ptr1 now points to value: %d\n", *ptr1);  // 输出: 20

    return 0;
}

3、int * const

int * const 表示常量指针,指针本身是常量,不能改变指向的地址,但指针指向的内容可以改变。

#include <stdio.h>

int main() {
    int a = 10;
    int b = 20;

    // 定义常量指针 p,指向变量 a
    int * const p = &a;  // p 是常量指针,指向 int 类型的变量 a

    // 可以通过 p 修改 a 的值
    *p = 30;  // 修改 a 的值,a 变为 30
    printf("a = %d\n", a);  // 输出: a = 30

    // 不能修改 p 指向的地址
    // p = &b;  // 错误:不能修改常量指针的地址

    return 0;
}

4、const int * const

const int * const 表示常量指针指向常量数据。指针本身是常量,不能改变指向,指针指向的内容也是常量,不能通过指针修改。

#include <stdio.h>

int main() {
    int x = 10;
    int y = 20;

    // 定义一个常量指针,指向一个常量整数
    const int * const ptr = &x;

    // 试图修改 ptr 指向的值(非法)
    // *ptr = 30; // 编译错误:无法通过 const 指针修改指向的值

    // 试图修改指针本身所指向的地址(非法)
    // ptr = &y;  // 编译错误:无法修改 const 指针本身的地址

    // 打印值
    printf("Value pointed by ptr: %d\n", *ptr); // 输出 10

    return 0;
}

5、const 关键字位置的影响

const int * 表示指向常量整数的指针,指针可以改变指向,但不能通过它修改指向的值;int * const 表示常量指针,指针本身不能改变指向,但可以修改指向的内容;const int * const 表示指向常量整数的常量指针,指针既不能改变指向,也不能修改指向的值。通过这些不同的组合,const 可以控制指针和指向的值是否可变。

声明

含义

const int

常量整数,等价于int const

,不能修改其值。

int const

常量整数,等价于const int

,不能修改其值。

const int *

指向常量整数的指针,不能修改指针指向的值,

但可以改变指针指向的地址。

int const *

指向常量整数的指针,等价于

const int *

int * const

常量指针,指向整数,不能改变指针指向的地址,

但可以修改指针指向的值。

const int * const

常量指针指向常量整数,既不能修改指针的指向,

也不能修改指针指向的内容。

推荐文档