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

C语言指针常量和常量指针的区别(附带示例)

在C语言中,指针常量常量指针是两个容易混淆的概念,它们虽然看起来相似,但实际上有着很大的区别。
 

指针常量(Pointer Constant)是说指针本身是一个常量,它所存储的地址值不能改变。这意味着,一旦我们初始化了一个指针常量,就不能再改变它的指向。然而,我们可以通过这个指针来修改它所指向的内容(也就是它所指向的内存位置中的值)。换句话说,指针是固定的,但指针指向的内容是可变的。
 

常量指针(Constant Pointer)则是指向常量的指针。这意味着指针可以指向不同的内容(也就是它所指向的内存位置中的值),但是不能通过这个指针来修改内容。也就是说,指针本身可以改变,可以指向不同的内容,但是它所指向的内容是不可修改的。
 

为了更好地理解这两个概念,我们来看一下它们的语法格式和一些示例代码:


指针常量的语法格式:

数据类型 * const 指针名 = &变量名;  //声明以后必须立即初始化

常量指针的语法格式:

const 数据类型 * 指针名;
数据类型 const * 指针名;

它们的语法格式类似,只是 const 的位置不同。const 离谁近,就用来修饰谁,谁的值就不能改变。


现在,让我们通过一些具体的代码示例来展示这两种指针的使用和区别:

#include <stdio.h>

int main() {
    int x = 10, y = 20;
    
    // 指针常量
    int * const ptr1 = &x;
    *ptr1 = 30;  // 合法,可以修改指针指向的值
    // ptr1 = &y;  // 非法,不能修改指针本身的值(指向的地址)
    
    // 常量指针
    const int *ptr2 = &x;
    ptr2 = &y;  // 合法,可以修改指针指向的地址
    // *ptr2 = 40;  // 非法,不能通过指针修改指向的值
    
    printf("x = %d, y = %d\n", x, y);
    printf("*ptr1 = %d, *ptr2 = %d\n", *ptr1, *ptr2);
    
    return 0;
}

输出结果:

x = 30, y = 20
*ptr1 = 30, *ptr2 = 20

在上面的示例中,我们定义了一个指针常量 ptr1 和一个常量指针 ptr2。ptr1 始终指向变量 x,我们可以通过 ptr1 修改 x 的值,但不能让 ptr1 指向其他变量。相反,ptr2 可以改变它所指向的地址(从指向 x 变为指向 y),但我们不能通过 ptr2 来修改它所指向的值。
 

理解这两种指针的区别对于编写安全和高效的 C 程序非常重要。指针常量通常用于确保指针始终指向特定的内存位置,而常量指针则用于保护数据不被意外修改。
 

值得注意的是,我们还可以将这两种概念结合起来,创建一个指向常量的常量指针:

const int * const ptr = &x;

在这种情况下,ptr 既不能指向其他地址,也不能用来修改它所指向的值。这种组合提供了最严格的限制,确保了指针和它所指向的内容都不会被修改。

相关文章