const指针抛出编译错误

时间:2017-07-13 16:45:52

标签: c pointers const

#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的指导线指针它应该能够更改值,如果我尝试更改地址然后它应该返回错误,但为什么我在上面的代码中得到编译错误?

4 个答案:

答案 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 ...