#include <stdio.h>
int main(void) {
int a[] = { 10, 11 };
int * const ptr = a;
*ptr = 11; /* Here the value should be properly changed as I have taken
const pointer (address of the pointer can not be changed) and not pointer to
const (data pointed by the pointer can not be changed) */
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;
}
在上面的程序中,我正在使用const
指针,这意味着如果我更改它指向的地址然后它应该给出错误,但我只是改变它指向的值,按照const的指导线指针它应该能够更改值,如果我尝试更改地址然后它应该返回错误,但为什么我在上面的代码中得到编译错误?
答案 0 :(得分:4)
ptr++;
你认为你在做什么?基本上,您正在更改const指针的值(它与指针所指向的对象的值不同,并且可以通过*ptr
获得)。因此来自编译器的错误。
此外,由于您在%p
中使用了printf
,因此您应该将ptr
的值转换为void*
,而不是您拥有的unsigned int*
。
答案 1 :(得分:4)
但我只是改变它指出的值
如果要更改作为对象a[0]
的指针所指向的对象的值,则应编写
( *ptr )++;
或
++*ptr;
而不是
ptr++;
在最后一个表达式中,您尝试更改常量指针本身,编译器显然会发出诊断消息。
考虑到本声明中的演员
printf("\n Address pointed by ptr : [%p]\n",(unsigned int*)ptr);
没有意义。你应该写
printf("\n Address stored in ptr : [%p]\n",(void *)ptr);
答案 2 :(得分:2)
const char *ptr
- 表示指针指向的对象是const,但指针本身不是
char * const ptr
- 表示指针本身是常量但指向的对象不是
const char * const ptr
- 指针和指向ob对象都是常量
答案 3 :(得分:2)
如果我尝试更改地址,那么它应该返回错误
从本质上讲,指针及其值是地址。
这样做
p++;
尝试更改它,您明确禁止将const
放在*
的右侧
int * const ptr ...