int main ()
{
int numbers[5];
int * p;
p = numbers; *p = 10;
p++; *p = 20;
........
好的,这是来自他们网站的 c++ 手册中的指针部分。我迷路了。
如果p
是对数组的引用,它在第 4 行增加了什么?或者它甚至指向数组numbers
?
什么时候比仅仅重新分配数组中的值更好?
p
不是对数组的引用,而是指向整数的指针。当一个指针增加时,它的值增加了所指向类型的大小,在这种情况下是4
.
在赋值p = numbers;
中,numbers
(数组的名称)衰减为指向其第一个元素(即&numbers[0]
)的指针,然后将其赋值给p
。然后,在你做之后p++
,p
指向 - 的下一个元素,numbers
即p
等于&numbers[1]
。
在您展示的情况下,没有理由直接使用数组访问来执行此操作。您可能需要这样做以与某些功能或 API 进行交互,或者出于某些其他程序设计原因,这就是可能的原因。
p 指向 numbers 数组中的第一个变量,所以
*p = 10
设置数字[0] = 10。
然后他增加 p (p++) 指向的地址,所以现在 p 指向数字 [1]。然后用 20 填充 numbers[1]。仅此而已
这是我的想法,如果我错了,请纠正我。
int *p;
决定 p 应该是什么 - 一个整数指针,即一个存储内存地址位置的变量(如果你尊重,它只需要一个整数值)
p = numbers;
不决定前一行中已经声明的 p 应该是什么。
它只是用 numbers 的“右值”分配变量 p(即为 p 分配的内存)。即数字计算值,它实际上是数字数组中第一项的内存地址。
p
并且number
没有任何共同之处,只是它们具有相同的值——即内存地址。
p
并且number
被 c++ 区别对待,因为p
指向一个整数,number
指向一个数组。如果你做一个 sizeof 你会得到整数和数组的 sizeof 作为 return 。
在 C++ 中,数组是一种指针,它指向数组中的第一个值。语法numbers[2]
的含义与*(numbers+2)
. 当您将指针复制numbers
到p
时,您p
还指向数组的第一个值numbers[0]
. 增加它p++
使其指向数组的第二个值,numbers[1]
。
当你执行命令*p = 10;
和*p = 20;
时,你将指向的值设置为p
等于 10 和 20;这些分别是numbers[0]
和numbers[1]
。