我想知道两者之间的差异
const int* ptr;
以及
int * const ptr;
它是如何工作的。
对我而言,理解和记住这个还是比较困难的。 请帮忙。
我想知道两者之间的差异
const int* ptr;
以及
int * const ptr;
它是如何工作的。
对我而言,理解和记住这个还是比较困难的。 请帮忙。
const int* ptr;
声明ptr
是一个指向const int
类型的指针。你可以修改ptr
本身,但是不能修改ptr
所指向的对象。
const int a = 10;
const int* ptr = &a;
*ptr = 5; // wrong
ptr++; // right
虽然
int * const ptr;
声明ptr
为指向int
类型的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
int i = 10; const int* ptr = &i;
也可以使用。这意味着ptr
并不总是指向一个常量值。你也可以通过它指向一个变量值。只是你永远无法修改ptr
所指向的值。 - RBTconst int * const a
声明 a
为指向 const int
的 const
指针。在这种情况下,既不能修改 a
,也不能通过 *a
修改 a
所指向的对象。 - haccksconst int * ptr;
表示指向的数据是常量且不可变,但指针本身不是。
int * const ptr;
表示指针是常量且不可变的,但所指向的数据不是。
const
的指针并不意味着指针所指向的对象是const
。将指针定义为指向const
只影响我们可以对指针做什么。 - user117482611) 常量指针:这种类型的指针是不能改变它们所指向的地址的。这意味着假设有一个指针指向一个变量(或存储该变量的地址)。现在,如果我们试图将指针指向其他变量(或尝试使指针存储其他变量的地址),那么常量指针无法实现此操作。
常量指针声明为:int *const ptr
('const' 的位置使指针 'ptr' 成为常量指针)
2) 指向常量的指针:这种类型的指针不能改变它们所指向的值。这意味着它们不能改变它们持有地址的变量的值。
指向常量的指针声明为: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’
引用:This Thread
常量指针
首先让我们了解什么是常量指针。常量指针是一个指针,它不能改变其所持有的地址。换句话说,一旦一个常量指针指向一个变量,那么它就不能指向任何其他变量。
常量指针声明如下:
<指针类型> * const <指针名称>
一个示例声明如下:
int * const ptr;
下面是一个小代码示例,用于说明这些类型的指针:
#include<stdio.h>
int main(void)
{
int var1 = 0, var2 = 0;
int *const ptr = &var1;
ptr = &var2;
printf("%d\n", *ptr);
return 0;
}
在上面的例子中:
指向常量的指针
从名称上可以看出,指向常量的指针是指不能更改它所指变量的值的指针。这种类型的指针可以改变它们所指的地址,但不能更改这些地址中存储的值。
指向常量的指针定义为:
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;
}
在上面的代码中:
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
,但不能直接键入*ptr2
:i = 4;
printf("before: %d\n", *ptr2); // prints 4
i = 5;
printf("after: %d\n", *ptr2); // prints 5
*ptr2 = 6; // still an error
您可以使用同时具有这两个特征的指针:
const int * const ptr3 = &i;
ptr3 = &j; // error
*ptr3 = 7; // error
const int* ptr;
这里的意思是认为 *ptr 是常量,不能再次更改。
int * const ptr;
而这里的意思是将 ptr 视为常量,不能再次更改。