const指针修复变量变量

时间:2011-04-03 21:53:32

标签: c pointers const variable-assignment readonly

我无法弄清楚如何告诉C我想要一个不会移动的指针。它总是指向同一个数组。也就是说,数组成员不是常量,但数组本身是全局的,所以它处于固定的位置。

所以,当我编码时:

#include <stdio.h>

int v[2]={0, 1};
const int *cpv=v;

int main(void)
{
    v[1]=2;     printf("%d\n", v[1]);
    *(cpv+1)=3; printf("%d\n", v[1]);
    cpv[1]=4;   printf("%d\n", v[1]);
}

并得到这个错误:

constp.c: In function ‘main’:
constp.c:9: error: assignment of read-only location '*(cpv + 4u)'
constp.c:10: error: assignment of read-only location '*(cpv + 4u)'

我知道编译器认为我需要const int v[2]才能使用const int *iv。如何获得一个常量指针来完成这项工作?

如果您看到错误消息,我甚至没有移动指针(如pv++)。我只是取消引用它错位了一些字节。

如果我这样做:

int *pv=cpv;
*(pv+1)=5;  printf("%d\n", v[1]);
printf("%p == %p !?\n", cpv, pv);

我得到了这个警告,但它确实有效:

constp.c:9: warning: assignment discards qualifiers from pointer target type
pointer# ./constp 
5
0x601020 == 0x601020 !?

谢谢, BECO。

5 个答案:

答案 0 :(得分:5)

移动const限定符:

int *const cpv=v;

说明:在C声明规则中,从标识符开始从右到左读取:“cpv是指向int的常量指针”。您的版本将被读取“cpv是指向int常量”的指针。

请注意,cpv+1仍会在int之后为您指向*cpv;制作指针const只能阻止++--+=-=

答案 1 :(得分:2)

您正在使用指向const的指针,而不是const指针。

  

const int * cpv = v;

应该变成:

  

int * const cpv = v;

答案 2 :(得分:2)

指针有点“向后看”:

const int * p;

在这种情况下,“p”是指向“const int”的(变量)“指针”。从字面上看,向后读取,“*”表示“指针”: “Pointer ... to int const”。

奇怪的是,以下内容是相同的:

int const * p;  // same thing

向后读,它说, “指针......到const int” (同样的事情)。

所以,如果你希望你的指针是“常量”(不是变量),你需要向后读取并做到这一点:

int * const p;  // p cannot change

现在,“p”是一个指向非常数整数的常量指针。不是belabor,而是向后读, “const pointer ... to int”。

使用上面的“相同的东西”示例,我们现在可以有一个指向常量整数的常量指针(以下是相同的):

const int * const p;
int const * const p;

你应该向后阅读它们,并且它们都说同样的事情, “指示指针...到常数int”。

答案 3 :(得分:1)

#include <stdio.h>

int v[2]={0, 1};
//const int       *      cpv=v; // cpv is a pointer to int const
//      int const *      cpv=v; // cpv is a pointer to const int == same as above ==
        int       *const cpv=v; // cpv is a constant pointer to int
//      int const *const cpv=v; // cpv is a constant pointer to const int
//const int       *const cpv=v; // cpv is a constant pointer to int const == same as above ==
//const int const *const cpv=v; // == same as above ==

int main(void)
{
    v[1]=2;     printf("%d\n", v[1]);
    *(cpv+1)=3; printf("%d\n", v[1]);
    cpv[1]=4;   printf("%d\n", v[1]);
}

答案 4 :(得分:1)

int * const cpv=v;

话虽如此,为什么你需要指针呢?如果要直接访问变量v,编译器将能够做得更好。如果你通过指针,生成的代码必须在每次访问数组时从内存中读取指针。