实际上我不知道普通指针和const指针之间有什么区别
如果我使用下面的代码它将工作正常。但是当我将int *ptr=#
更改为int *const ptr = &var1;
时,它将无效。谁能解释普通指针和常量指针之间有什么区别?
int main(void)
{
int num = 20;
int *ptr = &num ; // if i change to `int *const ptr = &var1;` then it shows some error
*ptr = 20 ; // Valid
ptr ++ ; // valid
return 0;
}
答案 0 :(得分:5)
int* const ptr = &num ;
将创建一个指向int的常量指针。它指向的数据可以改变,但它自己的指针不能改变。
您无法更改指针:
ptr++ ;
但您可以更改数据:
*ptr = 1234 ;
答案 1 :(得分:3)
我们可以对常量指针进行以下操作
我们无法对常量指针进行以下操作
所以,在你的问题中......
如果您声明
int* const ptr = &num ; // this is ok
下一行
*ptr = 20 ; // Assigning value at address this is ok
现在,
ptr ++ ; // you can not change the value // Error!
希望它有所帮助!
答案 2 :(得分:1)
此:
int* const ptr = &num ;
将为整数创建常量指针。您可以使用它来修改整数的值,但不能更改指针指向的位置,因此ptr++ ;
无效。
const
关键字通常应用于其左侧符号,例如
int * const ptr; // A constant pointer (*)
int const * ptr; // A pointer to a constant integer
int const * const ptr; // A constant pointer to a constant integer
const int *ptr; // Shorthand for pointer to a constant integer (equivalent to int const * ptr;)
当你想要传递一个固定的内存位置并且你想确保没有人会修改指针的指向地址时, const
指针很有用。
答案 3 :(得分:1)
在c中,const
是type qualifier
。在某些变量定义中使用const
意味着,在程序的整个生命周期内,变量不会被修改(将被视为read-only
)。
通常,在使用const
定义变量/数据类型时,实践是使用所需的值对其进行初始化,因为通常情况下,它保留的值不能在以后修改。
例如:
const int a = 10;
表示,整数a
将保留值10
,并且无法更改。在稍后的部分,
a = 20;
会产生错误。
所以,在你的情况下
int *const ptr = &var;
此处,ptr
将始终保留var
的地址,并且无法更改,即我们无法写入
ptr = &num2; // where num2 is another int, declared like int num2;
它将显示编译时错误,如:
错误:分配只读变量“* ptr”。
你可以找到一个漂亮而方便的描述here。
答案 4 :(得分:1)
int* const pointer = &x ;
它创建一个指向int的常量指针。它指向的数据可以改变,但它自己的指针不能改变
您无法更改指针:
pointer++ ;
在这里你可以改变数据:
*pointer=1 ;
答案 5 :(得分:0)
如果使用普通指针,则可以更改指针值和 value @指针。但是,随着指针更改值@指针会自动更改为某些垃圾值。
#include <stdio.h>
int main () {
int val = 5;
int *ptr = (int*)&val;
printf("val@ptr : %d \nptr : %x\n", *(ptr), (int*)ptr);
val++;
printf("\nIncrement val++\n");
printf("val@ptr : %d \nptr : %x\n", *(ptr), (int*)ptr);
ptr++;
printf("\nIncrement ptr++\n");
printf("val@ptr : %d \nptr : %x\n", *(ptr), (int*)ptr);
return 0;
}
输出:
val@ptr : 5
ptr : 93ddc274
Increment val++
val@ptr : 6
ptr : 93ddc274
Increment ptr++
val@ptr : -1814183304
ptr : 93ddc278
但是对于 const指针,只能更改 value @指针。请参见下面的示例。
#include <stdio.h>
int main () {
int val = 10;
//always start reading from right to left
int *const ptr = (int*)&val;//ptr is const pointer to int, i.e. ptr can not be change at all.
printf("The value1 @ptr : %d\t and ptr val : %x\n", *(ptr), (int*)ptr);
val++;
//ptr++;
printf("The value1 @ptr : %d\t and ptr val : %x\n", *(ptr), (int*)ptr);
return 0;
}
输出:
The value1 @ptr : 10 and ptr val : ee2ccf24
The value1 @ptr : 11 and ptr val : ee2ccf24
如果我们取消注释行号11,则输出将如下所示:
main.c:11:7: error: increment of read-only variable ‘ptr’
ptr++;
请通过链接获得更好的理解:http://c-faq.com/decl/spiral.anderson.html