常量指针vs指针常量
我想知道之间的区别
const int* ptr;
和
int * const ptr;
以及它如何工作。
我很难理解或记住这一点。 请帮忙。
const int* ptr;
声明ptr
一个指向const int
types的指针。 您可以自行修改ptr
但不能修改ptr
指向的对象。
const int a = 10; const int* ptr = &a; *ptr = 5; // wrong ptr++; // right
而
int * const ptr;
声明ptr
是一个int
types的const
指针。 你不能修改ptr
但是ptr
指向的对象。
int a = 10; int *const ptr = &a; *ptr = 5; // right ptr++; // wrong
一般而言,我更喜欢这样的声明,这使得它易于阅读和理解(从右向左读):
int const *ptr; // ptr is a pointer to constant int int *const ptr; // ptr is a constant pointer to int
const int * ptr;
意味着指向的数据是不变且不可变的,但指针却不是。
int * const ptr;
意味着指针是不变且不变的,但指向的数据不是。
1)常量指针:这些types的指针是不能改变它指向的地址的指针。 这意味着假设有一个指针指向一个variables(或存储该variables的地址)。 现在,如果我们试图将指针指向其他一些variables(或者尝试使某个其他variables的指针存储地址),那么常量指针就无能为力了。
一个常量指针被声明为: int *const ptr
('const'的位置使指针'ptr'成为常量指针)
2)指向常量的指针:这些types的指针是不能改变它们指向的值的指针。 这意味着他们不能改变他们所持有地址的variables的值。
一个指向常量的指针被声明为: const int *ptr
('const'的位置使'ptr'指针指向常量。
例
常量指针
#include<stdio.h> int main(void) { int a[] = {10,11}; int* const ptr = a; *ptr = 11; printf("\n value at ptr is : [%d]\n",*ptr); printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr); ptr++; printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr); return 0; }
现在,当我们编译上面的代码时,编译器会抱怨:
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'
因此我们在上面看得很清楚,编译器抱怨我们不能改变一个常量指针所保存的地址。
指向常量的指针
#include<stdio.h> int main(void) { int a = 10; const int* ptr = &a; printf("\n value at ptr is : [%d]\n",*ptr); printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr); *ptr = 11; return 0; }
现在,当编译上面的代码时,编译器会抱怨:
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'
因此我们在这里也看到编译器不允许指向常量的指针来改变被指向的variables的值。
行情
const int* ptr;
是一个指向常量(内容)的指针。 你可以修改指针。 例如ptr = NULL
, ptr++
,内容的修改是可能的。
int * const ptr;
是一个常数指针。 相反是可能的。 您不允许修改指针,但不允许修改它指向的内容,例如*ptr += 5
。
int i; int j; int * const ptr1 = &i;
编译器会阻止你改变ptr1
。
const int * ptr2 = &i;
编译器会阻止你改变*ptr2
。
ptr1 = &j; // error *ptr1 = 7; // ok ptr2 = &j; // ok *ptr2 = 7; // error
请注意,您仍然可以更改*ptr2
,而不是按字面input*ptr2
:
i = 4; printf("before: %d\n", *ptr2); // prints 4 i = 5; printf("after: %d\n", *ptr2); // prints 5 *ptr2 = 6; // still an error
你也可以有一个指针和两个function:
const int * const ptr3 = &i; ptr3 = &j; // error *ptr3 = 7; // error
从这个线程提交
常指针
让我们先了解一个常量指针是什么。 常量指针是一个指针,不能改变其持有的地址。 换句话说,我们可以说一旦一个常量指针指向一个variables,那么它就不能指向任何其他variables。
常量指针声明如下:
<type of pointer> * const <name of pointer>
示例声明如下所示:
int * const ptr;
让我们拿一个小代码来说明这些types的指针:
#include<stdio.h> int main(void) { int var1 = 0, var2 = 0; int *const ptr = &var1; ptr = &var2; printf("%d\n", *ptr); return 0; }
在上面的例子中:
- 我们声明了两个variablesvar1和var2
- 一个常量指针“ptr”被声明并指向var1
- 接下来,ptr指向var2。
- 最后,我们尝试打印ptr指向的值。
指向常量的指针
从名字可以看出,一个指针不能通过它来改变它所指向的variables的值,就是一个指向常量的指针。 这些types的指针可以改变它们指向的地址,但是不能改变这些地址处的值。
指向常量的指针定义如下: const <type of pointer>* <name of pointer>
定义的例子可以是: const int* ptr;
让我们拿一个小代码来说明一个常量的指针:
#include<stdio.h> int main(void) { int var1 = 0; const int* ptr = &var1; *ptr = 1; printf("%d\n", *ptr); return 0; }
在上面的代码中:
- 我们定义了一个值为0的variablesvar1
- 我们定义了一个指向variablesvar1的常量的指针
- 现在,通过这个指针,我们试图改变var1的值
- 使用printf来打印新的值。
请参阅以下链接,以便更好地了解Const指针和指针之间的差异。
常量指针与常量值上的指针
const int* ptr;
这里认为像* ptr是不变的,* ptr不能再改变
int * const ptr;
而这里认为ptr是一个常数,不能再改变