分配给const int *

时间:2009-02-27 11:00:52

标签: c pointers const

void main()
{
const int * a;
*a = 5;
}

gcc错误:指定只读位置。

那么,如何在不使用其他变量的情况下分配给* a? 什么可以使用上面的声明?

7 个答案:

答案 0 :(得分:10)

const int * a;

从右到左阅读声明。[见注释]你得到了什么? a*,即指向int的指针,即整数const,即常数。简而言之,变量a指向一个整数,其值不能更改。至少,不是通过a。指针对象是否真的是不可变的是一个不同的问题。但事实仍然是,您无法使用a修改*a;

const是你对自己的承诺:我永远不会尝试使用指向const的指针来修改指针。编译器只为您提供支持。

如果你真的想要写入指针,你需要一个非const指针,如:

int *a;
*a = 42; /* this is fine */

来自bortzmeyer的一个非常好的评论:(我以为我会跳过这个来保持简单:)

  

您也可以将const放在*之后(如您所说,声明应该从右到左阅读。)

他的意思是:

const int *a;

没有什么不同
int const *a;

(请记住,从右到左阅读规则?) 但与以下内容截然不同:

int * const p;

阅读它我们得到:pconst( - 蚂蚁)*(指针)int( - eger)。翻译:一旦你设置p指向一个整数,你就不能重新设置它(即写入它使它指向另一个整数 - 使p不变的点),但你可以写很多指针(指针不是常数)。

注意:对于迂回倾向的人来说,Darron来自“{规则”:

“声明应该从右到左阅读”是一种简化 - 如果有括号,则应从内到外阅读。除非括号表示函数调用。真正的规则是“将其视为表达;如果我应用这些运算符,我将最终得到这种简单类型”。

对于 bortzmeyer Darron ,这个答案真的会少得多 - 谢谢!

PPS:(我保证这将是最后一次编辑。好吧,希望!)

void main()不是C或C ++中main的标准签名。在你认识自己之前不要使用它,或者(更重要的是)你的代码将永远无法前往另一个宇宙。

答案 1 :(得分:2)

一个例子说明了Ruben Bartelink的出色解释:

#include <stdlib.h>

int main()
{
  int * const a = malloc(sizeof(int));
  if (a == NULL) 
    return 1;
  *a = 3;
  free(a);
  return 0;
}

这里,a是常数(因此必须初始化)但不是* a(可能是OP想要的)。

答案 2 :(得分:2)

让我把你的问题简单化为英文。

  • 如果我保证编译器不会写入变量a指向的值,如何写入变量a指向的值?

答案:改变承诺,至少在当地。

int main()
{
    const int * a;
    *((int *) a) = 5;
}

希望上面的措辞清楚地表明这通常是一个坏主意。

答案 3 :(得分:1)

您的意思是int * const,而不是const int *。在一种情况下,指针是const,另一种是它指向的东西是const。您也可以const int * const。阅读一些关于const_cast的文章没有坏处,它们应该很好地涵盖这一点。

答案 4 :(得分:0)

您不能指定const的分数吗?虽然,我不记得const指针的情况,如果它指向的值不能改变,或指针的地址。或两者。我的猜测是两者都无法改变。

它也可能是您尝试写入未初始化内存的一般警告(或错误,具体取决于编译器设置)。

正确(我假设):

void main()
{
   const int* a = new int(5);
}

答案 5 :(得分:0)

没有回答“如何分配给* a,而不使用其他变量?”但只是“什么可以使用上面的声明?”。

承诺不修改指向的值。正如评论中所讨论的那样, if 你对允许自己使用构造的方式进行限制,你可以得出它没有用的结论。但如果您允许自己使用整个C语言,那么您可以找到用途。想想strcmp等原型。

答案 6 :(得分:-2)

问题是你已经创建了一个指针,但它实际上并没有指向任何东西,所以当你取消引用它(或者尝试写入它引用的loaction)时,你会得到一个错误。