本帖最后由 wander 于 2024-12-16 21:18 编辑  
 
      在C语言中,指针常量和常量指针是两个容易混淆的概念,它们虽然看起来相似,但实际上有着很大的区别。 
       指针常量(Pointer Constant)是说指针本身是一个常量,它所存储的地址值不能改变。这意味着,一旦我们初始化了一个指针常量,就不能再改变它的指向。然而,我们可以通过这个指针来修改它所指向的内容(也就是它所指向的内存位置中的值)。换句话说,指针是固定的,但指针指向的内容是可变的。 
  常量指针(Constant Pointer)则是指向常量的指针。这意味着指针可以指向不同的内容(也就是它所指向的内存位置中的值),但是不能通过这个指针来修改内容。也就是说,指针本身可以改变,可以指向不同的内容,但是它所指向的内容是不可修改的。 
  为了更好地理解这两个概念,我们来看一下它们的语法格式和一些示例代码:  
指针常量的语法格式:
 数据类型 * const 指针名 = &变量名;  //声明以后必须立即初始化  
常量指针的语法格式: const 数据类型 * 指针名; 数据类型 const * 指针名;  
它们的语法格式类似,只是 const 的位置不同。const 离谁近,就用来修饰谁,谁的值就不能改变。 · 对于指针常量,const 用来修饰指针本身,所以指针本身的值不能改变;但是 const 没有修饰指针所指向的内容,所以内容是可以改变的。 · 对于常量指针,const 用来修饰指针所指向的内容,所以内容不能改变;但是 const 没有修饰指针本身,所以指针的指向可以改变。  
现在,让我们通过一些具体的代码示例来展示这两种指针的使用和区别:
 1. #include <stdio.h> 2. int main() { 3.     int x = 10, y = 20; 4.     // 指针常量 5.     int * const ptr1 = &x; 6.     *ptr1 = 30;  // 合法,可以修改指针指向的值 7.     // ptr1 = &y;  // 非法,不能修改指针本身的值(指向的地址) 8.      9.     // 常量指针 10.    const int *ptr2 = &x; 11.    ptr2 = &y;  // 合法,可以修改指针指向的地址 12.    // *ptr2 = 40;  // 非法,不能通过指针修改指向的值 13.     14.    printf("x = %d, y = %d\n", x, y); 15.    printf("*ptr1 = %d, *ptr2 = %d\n", *ptr1, *ptr2); 16.     17.    return 0; 18.} 输出结果: 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 既不能指向其他地址,也不能用来修改它所指向的值。这种组合提供了最严格的限制,确保了指针和它所指向的内容都不会被修改。  
 |