如果指针只是地址,为什么我不能为指针指定特定的int地址?

时间:2014-02-27 17:32:19

标签: c pointers int

正如我所解释的,指针是一个包含地址的变量。为什么我无法执行int *p = 5;那么,这不能正确指向内存地址5吗?

4 个答案:

答案 0 :(得分:6)

指针是数据类型,而不仅仅是地址,而int是一种不同的,不兼容的数据类型,因此您无法为指针指定int。

如果你真的需要它,并且你知道你在做什么,你可以将int(即char * p = (char*)5;)转换为特定的数据类型,但是在极少数情况下你需要这样的东西。

答案 1 :(得分:4)

  

指针是一个包含地址的变量

不不不不不。

如果人们真正掌握了基础知识,那么可以避免在StackOverflow上的C标签中出现很多问题。规则是:

  • 变量存储位置

  • 存储位置包含

  • 指针是一种特殊的

  • 指针可以取消引用。取消引用指针会生成存储位置

  • 存储位置可能已解决。寻址存储位置会产生指针

让我们回顾你的句子:

  

指针是变量......

不,指针是一个值。可能有一个包含指针的变量,就像可能存在一个包含int的变量一样。但是int不是变量,也不是指针。类似地,可以取消引用指针以生成与变量关联的存储位置,但这并不是说指针变量。

  

......持有地址

按定义指针是一个地址,但地址实际上由组成的是一个实现细节。当解除引用生成存储位置时,指针会保存某些。 C编译器实现者的一个常见选择是使指针的值成为虚拟内存的一大块数字偏移,但作者没有要求 C编译器将整数偏移量作为指针用于虚拟内存。

要求地址 convertible 到整数,并且整数可以 convertible 回到地址,并且这些映射服从某些限制他们的行为。但是就你所知,地址可以是字符串“5”,转换为整数可以是在那个东西上调用atoi。那将是愚蠢的,但这是合法的。

  

为什么我无法int *p = 5;

谁说你不能?

C11规范说:

  

整数可以转换为任何指针类型。除非事先指明,否则   结果是实现定义的,可能没有正确对齐,可能不指向   引用类型的实体,可能是陷阱表示。用于将指针转换为整数或整数的指针用于指针   与执行环境的寻址结构一致。任何指针类型都可以转换为整数类型。除非事先指明,否则   结果是实现定义的。如果结果无法以整数类型表示,   行为未定义。结果不必在任何整数的值范围内   类型。

所以你去吧。如果您正在使用的编译器在将5映射到特定地址时给出了含义,那么您将非常棒。如果没有,那么你将陷入最糟糕的未定义行为。基本上没有要求C编译器的开发人员在指针和整数之间进行任何转换,除了零始终是空指针,并且没有有效对象的地址为零。

答案 2 :(得分:1)

是的,从理论上说这是正确的 (地址5除外你可能不应该使用) 也许你会从编译器得到警告/错误 因为指定一个普通数字是不常见的,
但是有一个演员会接受它:

int *p = (int*)5;

答案 3 :(得分:0)

您无法为此类指针指定地址,因为您没有权利。也许该地址已被其他程序或操作系统使用。你必须分配一个地址:

int *n;
n = malloc(sizeof(int));