指针可以指向一个值,指针值是否指向地址?

时间:2016-04-19 09:03:26

标签: c++ c pointers reference dereference

正如我在书中读到的正常指针用法如下:

int *pointer;
int number = 5;
pointer = &number; 

然后*指针的值为5。 但这是否相反?我的意思是:

int *pointer;
int number = 5;
*pointer = &number;

这里指针包含值5,而*指针包含数字地址?

感谢。

6 个答案:

答案 0 :(得分:3)

int *pointer;
int number = 5;
*pointer = &number;

您从未为pointer分配有效地址,因此取消引用该指针(由表达式*pointer完成)无效。

答案 1 :(得分:2)

你的第二个案例不会编译,因为作业*pointer = &number涉及不兼容的类型(左边是int,右边是int的指针),这使得作业无效。 / p>

如果您以某种方式强制将分配强制转换为编译,则pointer未初始化。访问其值,更不用说取消引用它(例如,评估*pointer或在*pointer = number*pointer = 5中分配它)会产生未定义的行为。任何事情都可能发生......根据具体情况,未定义行为的常见结果是程序异常终止。

答案 2 :(得分:2)

*pointer = &number;无效C.

*pointer的类型为int&number的类型为int*。这不是有效的赋值形式,也不会在标准C编译器上编译。

您可以在指针变量中存储数字,但是必须使用显式强制转换来强制进行类型转换。有些编译器允许它没有显式强制转换,但请注意,这样做是非标准的扩展。

当然,请注意,您尚未将pointer设置为指向已分配的内存地址,因此您无法在指向的位置存储任何内容。

如果你做了一个明确的演员,比如

pointer = &something;
*pointer = (int)&number;

然后在C中允许它,但如果您尝试取消引用该指针,则该行为是实现定义的。如果未对准等,也可能是未定义的行为。参见C11 6.3.2.3:

  

整数可以转换为任何指针类型。除了以前   指定,结果是实现定义的,可能不是   正确对齐,可能不指向引用的实体   类型,可能是陷阱表示。

答案 3 :(得分:2)

类比来自于一些牵强附会的类比:

你每天都会多次使用指针而不考虑它。

指针是间接 - 它告诉你 某些东西是什么,或者它是如何到达的,但 那是什么 。
(在一种打字的语言中,你可以知道它是什么 kind ,但那是另一回事。)

例如,考虑一下电话号码。

这些告诉您如何联系电话号码所属的人 随着时间的推移,这个人可能会改变 - 也许有人没有支付账单并且号码被重新分配 - 但只要数字有效,你就可以用它来接触一个人。

使用这个类比,我们可以定义以下操作:

  • &person会为您提供一个人的电话号码,
  • *number为您提供该号码所属的人。

一些规则:

  • 这种语言只有两种类型 - 人和电话号码。
  • 只有人才能有电话号码; &number是一个错误,*person也是如此。
  • 未指定的电话号码到达Acme,Inc。的客户服务总经理

现在,您的第一个示例将转换为

PhoneNumber n;
Person Bob;
n = &Bob;

这是有道理的; n现在拥有Bob的电话号码。

您的第二个示例将转换为

PhoneNumber n;
Person Bob;
*n = &Bob;

会说"用Bob的电话号码取代Acme Inc的客户服务总经理#34;这根本没有意义。

你的最后一个问题,

  

这里指针包含值5,而*指针包含数字地址?

会转换为

  

这个电话号码和Bob一样吗?如果你打电话,鲍勃的电话号码会回答吗?

我相信你能看到的是一个相当奇怪的问题。

答案 4 :(得分:1)

要编写作业x = yxy必须是或可以隐式转换为相同类型(或x必须有用户-defined赋值运算符接受与y类型相匹配的参数,或者......好的,有一些可能性,但是你明白了。

现在,让我们看一下声明

*pointer = &number;

在这里,*pointer具有类型int& - 您按照指针获取(引用)存储在该位置的整数。到目前为止,我们忽略了你的指针未初始化并跟随它会导致未定义的行为。

右侧&number正在指向整数变量,因此类型为int*

因此,表达式根本没有意义,只是在类型系统方面:没有办法将int*分配给int&。它不是意味着任何东西。

让我们将它与您问题的英语联系起来

  

这里指针包含值5,而*指针包含数字地址?

直接转换为类型系统,因此并不意味着什么。再次,我们可以将其分解

  •   

    指针是否包含值5

    指针包含位置。只讨论具有字面值(不是nullptr)的指针的唯一时间是在一个有着名地址的平台上 - 这很少见,并且'5'不太可能无论如何要成为一个格式良好的地址

  •   

    *指针保存地址

    好吧,有一种情况*pointer可以保存一个地址 - *pointer本身就是一个指针,这意味着变量pointer是一个指向指针的指针,如int **。情况并非如此:我们知道代码中*pointer的类型,它是int&,而不是int*

    < / LI>

答案 5 :(得分:1)

当你创建一个指针变量时,最初它会有垃圾值(比方说300地址位置)。因此,当您取消引用指针(* 300)时,它会给出另一个垃圾值(300地址位置的值)或错误(严格来说,根据您的计算机可能会发生任何事情)。

在第三步中,&amp; number: - 这也是另一个数字,你正在尝试为*指针(可能是另一个数字)分配一个不可能的数字。 (就像这样: - 5 = 6)。因此这将是一个错误。