Constant pointer vs Pointer to constant
我想知道
1  | const int* ptr;  | 
和
1  | int * const ptr;  | 
以及它的工作原理。
我很难理解或记住这一点。请帮忙。
1  | const int* ptr;  | 
   A说
1 2 3 4  | const int a = 10; const int* ptr = &a; *ptr = 5; // wrong ptr++; // right  | 
随
1  | int * const ptr;  | 
   A说
1 2 3 4  | int a = 10; int *const ptr = &a; *ptr = 5; // right ptr++; // wrong  | 
一般会prefer这样的声明,这使它容易读和理解(读从两个左右):
1 2  | int const  *ptr; // ptr is a pointer to constant int  int *const ptr; // ptr is a constant pointer to int  | 
1  | const int * ptr;  | 
数据的均值,芒等immutable冰和冰槽,但指针。
1  | int * const ptr;  | 
均值,指针和冰等数据,但immutable芒冰槽。
1)常量指针:这些类型的指针不能更改指向的地址。这意味着假设有一个指针指向一个变量(或存储该变量的地址)。现在,如果我们试图将指针指向其他某个变量(或者尝试使其他某个变量的指针存储地址),那么常量指针就不能这样做。
常量指针声明为:
2)指向常量的指针:这些指针类型不能更改它们指向的值。这意味着它们不能更改所保存地址的变量的值。
指向常量的指针声明为:
例子
常量指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
现在,当我们编译上述代码时,编译器会抱怨:
1 2 3  | practice # gcc -Wall constant_pointer.c -o constant_pointer constant_pointer.c: In function ‘main’: constant_pointer.c:13: error: increment of read-only variable ‘ptr’  | 
因此,我们在上面非常清楚地看到,编译器抱怨我们不能更改常量指针持有的地址。
指向常量的指针
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19  | 
现在,当编译上述代码时,编译器会抱怨:
1 2 3  | practice # gcc -Wall pointer_to_constant.c -o pointer_to_constant pointer_to_constant.c: In function ‘main’: pointer_to_constant.c:12: error: assignment of read-only location ‘*ptr’  | 
因此,在这里我们也看到编译器不允许指向常量的指针更改所指向变量的值。
报价
   从referncing   this线程 
   
变分
让我们先明白什么是指针,冰淇淋等。A值是一个指针,指针的地址,不能改变它的股份。在其他的话,我们可以说,"一点两个指针的值是不能变点的两个网络的任何其他变量。
   A为常数指针冰follows宣布:
   
   以声明方式将看起来像:
   
   让我们采取一个小码的两个illustrate这些类型的指针:
   
1 2 3 4 5 6 7 8 9 10 11 12  | #include<stdio.h> int main(void) { int var1 = 0, var2 = 0; int *const ptr = &var1; ptr = &var2; printf("%d ", *ptr); return 0; }  | 
在以上的实例:
- 我们宣布的双变量和变量2 1 >
 - A值的指针ptr是宣布与制造两个点1 >
 - next ptr指针变量2两个冰淇淋制造。
 - 终于,我们试图打印的PTR值两个冰指指点点。
 
两个指针的值
名为"明显的"一通,指针不能变一变它的价值作为一个已知点冰的两个值的指针。这些类型的指针可以改变他们的地址,但不能两个相变点的值来把这些地址。
   一个指针的值定义为:冰   
1 2 3 4 5 6 7 8 9 10 11 12  |  #include<stdio.h> int main(void) { int var1 = 0; const int* ptr = &var1; *ptr = 1; printf("%d ", *ptr); return 0; }  | 
在上面的代码:
- 我们定义一个变量的值0和1
 - 我们定义一个指针,两个固定点的两个变量1
 - 现在,我们想通过这个指针的值的两个转变:1
 - 使用printf打印两个新的价值。
 
1  | const int* ptr;  | 
   两个指针是一个常数(内容)。你是允许修改这两个指针。例如
1  | int * const ptr;  | 
   指针是一个常数。在对面的是可能的。你是不允许修改的两个指针,但你有两个,它允许修改,例如
1 2 3 4  | int i; int j; int * const ptr1 = &i;  | 
   停止你的编译器会改变
1  | const int * ptr2 = &i;  | 
   停止你的编译器会改变
1 2 3 4 5  | ptr1 = &j; // error *ptr1 = 7; // ok ptr2 = &j; // ok *ptr2 = 7; // error  | 
   注意你可以改变
1 2 3 4 5 6 7  | 
你可以用一个指针也有两个特点:
1 2 3 4  | const int * const ptr3 = &i; ptr3 = &j; // error *ptr3 = 7; // error  | 
请参考下面的链接(更好的理解之间的差异教育的指针和指针在一个恒定值。
指针与指针的值是一个定值