指针基础知识
指针只是一个普通变量,它保存着其他东西的地址作为它的值。换句话说,一个指针指向可以找到其他东西的地址。通常你会想到一个保存立即值的变量,例如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 指向下一个字节(下一个char),对于int * 指针(正常的4 字节整数),pointer+1 将指向下一个int 在偏移处pointer 之后的 4 个字节。 (所以一个指针,只是一个指针....算术由type自动处理)
将 & 和 * 链接在一起
可用于获取对象地址和解引用指针的运算符是一元 '&' (address of) 运算符和一元 '*' (dereference)操作员。 '&' 在获取对象地址时增加了一层间接性。 '*' 在取消引用指针以获取指针所指向的值(或事物)移除了一级间接。所以正如@KamilCuk 在他的评论中举例解释的那样,你一个接一个地应用多少次并不重要,一个只是 adds 和另一个 删除了一层间接性,使得除了最终操作符之外的所有操作都是多余的。
(注意:在处理指针数组时,用于获取数组索引处的指针的后缀[..]运算符也起到取消引用删除一级间接的指针数组)
您的选择
鉴于您的声明:
int i = 40;
int *p = &i;
int *k = ___;
和上面的指针总结,你有两个选择,都是等价的。你可以直接用i的地址初始化指针k,例如
int *k = &i;
或者您可以通过分配p 持有的地址来初始化k,例如
int *k = p;
无论哪种方式,k 现在都将 i 的内存位置作为其值,40 当前存储在该内存位置。