正如我在书中读到的正常指针用法如下:
int *pointer;
int number = 5;
pointer = &number;
然后*指针的值为5。 但这是否相反?我的意思是:
int *pointer;
int number = 5;
*pointer = &number;
这里指针包含值5,而*指针包含数字地址?
感谢。
答案 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
也是如此。现在,您的第一个示例将转换为
PhoneNumber n;
Person Bob;
n = &Bob;
这是有道理的; n
现在拥有Bob的电话号码。
您的第二个示例将转换为
PhoneNumber n;
Person Bob;
*n = &Bob;
会说"用Bob的电话号码取代Acme Inc的客户服务总经理#34;这根本没有意义。
你的最后一个问题,
这里指针包含值5,而*指针包含数字地址?
会转换为
这个电话号码和Bob一样吗?如果你打电话,鲍勃的电话号码会回答吗?
我相信你能看到的是一个相当奇怪的问题。
答案 4 :(得分:1)
要编写作业x = y
,x
和y
必须是或可以隐式转换为相同类型(或x
必须有用户-defined赋值运算符接受与y
类型相匹配的参数,或者......好的,有一些可能性,但是你明白了。
现在,让我们看一下声明
*pointer = &number;
在这里,*pointer
具有类型int&
- 您按照指针获取(引用)存储在该位置的整数。到目前为止,我们忽略了你的指针未初始化并跟随它会导致未定义的行为。
右侧&number
正在指向整数变量,因此类型为int*
。
因此,表达式根本没有意义,只是在类型系统方面:没有办法将int*
分配给int&
。它不是意味着任何东西。
让我们将它与您问题的英语联系起来
这里指针包含值5,而*指针包含数字地址?
直接转换为类型系统,因此也并不意味着什么。再次,我们可以将其分解
指针是否包含值5
指针包含位置。只讨论具有字面值(不是nullptr
)的指针的唯一时间是在一个有着名地址的平台上 - 这很少见,并且'5'不太可能无论如何要成为一个格式良好的地址
*指针保存地址
好吧,有一种情况*pointer
可以保存一个地址 - *pointer
本身就是一个指针,这意味着变量pointer
是一个指向指针的指针,如int **
。情况并非如此:我们知道代码中*pointer
的类型,它是int&
,而不是int*
。
答案 5 :(得分:1)
当你创建一个指针变量时,最初它会有垃圾值(比方说300地址位置)。因此,当您取消引用指针(* 300)时,它会给出另一个垃圾值(300地址位置的值)或错误(严格来说,根据您的计算机可能会发生任何事情)。
在第三步中,& number: - 这也是另一个数字,你正在尝试为*指针(可能是另一个数字)分配一个不可能的数字。 (就像这样: - 5 = 6)。因此这将是一个错误。