考虑到以下几点,我试图找出填写int指针k的所有可能方法:
int i = 40;
int *p = &i;
int *k = ___;
到目前为止,我想到了“&I”和“p”。但是,是否可以用“*p”或“*p”填空呢?
我对“*&p”的理解是它正在取消对整数指针地址的引用。对我来说,这意味着如果打印出来就会输出p的内容,即&i,或者在初始化int指针时这是不可能的?或是任何时候都有可能?
我理解“&*p”,因为整数*p的内存地址指向。这个我也很不确定。
如果有人有任何建议或建议,我将非常感谢!真的想更好地理解指针。
最佳答案
指针基础知识
指针只是一个普通变量,它将其他对象的地址作为其值。换句话说,指针指向可以找到其他内容的地址。当你通常认为一个变量包含一个即时值,比如int i = 40;
,一个指针(比如int *p = &i;
)会简单地保存40
存储在内存中的地址。
如果需要存储在内存地址p
指向的值,则使用一元p
运算符取消引用'*'
,例如int j = *p;
将初始化j = 40
。
由于p
指向存储40
的地址,如果您在该地址更改该值(例如*p = 41;
)41
现在存储在以前40
的地址。因为p
指向i
的地址,并且您已经更改了该地址的值,i
现在等于41
。但是j
位于另一个内存位置,其值是在您更改i
地址处的值之前设置的,j
的值仍为40
。
如果要创建第二个指针(例如int *k;
),则只需创建另一个变量,该变量将地址作为其值。如果您希望k
引用p
持有的同一地址作为其值,您只需初始化k
,就像在声明时通过分配其值初始化任何其他变量一样,例如int *k = p;
(这与在初始化后的某个点分配k = p;
相同)。
指针算术
指针算法的工作方式与此相同,而不考虑指向的对象类型,因为指针的type
控制指针算法,例如使用char *
指针,pointer+1
指向下一个字节(nextchar
),对于int *
指针(正常的4字节整数),pointer+1
将指向int
之后偏移4字节处的下一个pointer
。(所以一个指针,只是一个指针。。。。其中,算法由type
自动处理)
把和*连在一起
可用于获取对象地址和解引用指针的运算符是一元'&'
(address of)运算符和一元'*'
(解引用)运算符。'&'
获取一个对象的地址会增加一级间接寻址。'*'
在取消指针的顺序以获取指针指向的值(或对象)时,会删除一个级别的间接寻址。因此,正如@KamilCuk在他的评论中举例说明的那样,一个接一个地应用多少次并不重要,一个简单地添加,另一个删除一定程度的间接操作,使得除了最后一个操作符之外的所有操作都是多余的。
(注意:在处理指针数组时,用于在数组索引处获取指针的postfix[..]
运算符也会取消指针数组的顺序,从而删除一级间接寻址)
你的选择
鉴于你的声明:
int i = 40;
int *p = &i;
int *k = ___;
上面的指针摘要,有两个选项,都是等价的。您可以直接用
k
地址初始化指针i
,例如。int *k = &i;
或者您可以通过分配
k
持有的地址来初始化p
,例如。int *k = p;
不管怎样,
k
现在都将当前存储i
的40
的内存位置作为其值。