我想知道
之间的区别const int* ptr;
和
int * const ptr;
以及它是如何运作的。
我很难理解或记住这一点。 请帮忙。
答案 0 :(得分:164)
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
指向const
类型的int
指针。您不能修改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
答案 1 :(得分:20)
const int * ptr;
表示指向的数据是常量且不可变的,但指针不是。
int * const ptr;
表示指针是常量且不可变的,但指向的数据不是。
答案 2 :(得分:8)
1)常量指针:这些类型的指针是无法更改它们指向的地址的指针。这意味着假设有一个指向变量的指针(或存储该变量的地址)。现在,如果我们尝试将指针指向其他变量(或尝试使指针存储其他变量的地址),那么常量指针就无法实现。
常量指针声明为: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’
因此,我们也看到编译器不允许指向常量的指针来改变被指向的变量的值。
答案 3 :(得分:4)
引自
This Thread
常量指针
让我们先了解常量指针是什么。常量指针是一个指针,它不能改变其持有的地址。换句话说,我们可以说一旦常量指针指向变量,它就不能指向任何其他变量。
常量指针声明如下:
<type of pointer> * const <name of pointer>
一个示例声明如下:
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;
}
在上面的代码中:
答案 4 :(得分:3)
const int* ptr;
是指向常量(内容)的指针。您可以修改指针。例如ptr = NULL
,ptr++
,但内容的修改不。
int * const ptr;
是一个常量指针。反之亦然。您不允许修改指针,但 允许修改它指向的内容,例如 *ptr += 5
。
答案 5 :(得分:2)
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
答案 6 :(得分:1)
请参阅以下链接,以便更好地了解常量值上Const指针和指针之间的区别。
答案 7 :(得分:1)
const int* ptr;
这里认为* ptr是常数而* ptr不能再改变
int * const ptr;
虽然在这里认为ptr是一个常数而且不能再次改变