更改指向数组的指针以获取特定的数组元素

时间:2020-03-06 14:28:42  来源:igfitidea点击:

我了解指针和引用的整体含义(或者至少我认为我确实了解),我也了解当我使用new时,我会动态分配内存。

我的问题如下:

如果我要使用cout <<&p,它将显示p的"虚拟内存位置"。
有没有一种方法可以操纵此"虚拟内存位置"?

例如,以下代码显示了一个int数组。

如果我想显示p [1]的值,并且知道p的"虚拟内存位置",我可以以某种方式执行"&p + 1"并获得p [1]的值。与cout << * p,现在将指向数组中的第二个元素?

int *p;
p = new int[3];

p[0] = 13;
p[1] = 54;
p[2] = 42;

解决方案

当然,我们可以操纵指针来访问数组中的不同元素,但是我们将需要操纵指针的内容(即p指向的地址),而不是指针本身的地址。

int *p = new int[3];
p[0] = 13;
p[1] = 54;
p[2] = 42;

cout << *p << ' ' << *(p+1) << ' ' << *(p+2);

每次加(或者减)表示数组中的后续(优先)元素。如果p指向地址12345处的4字节变量(例如,在典型的32位PC上为int),则p + 1将指向12349,而不是12346. 请注意,在取消引用p之前,需要更改p包含的值。访问它指向的内容。

不完全的。 "&p"是指针" p"的地址。 "&p + 1"将指向一个更远的地址" int *"。你想做的是

p=p+1; /* or ++p or p++ */

现在当你做

cout << *p;

我们将得到54. 区别在于," p"包含整数数组的起始地址,而"&p"是p的地址。要移动一个项目,我们需要指向int数组,而不是指向栈中,即p所在的位置。

如果只有&p,则需要执行以下操作:

int **q = &p; /* q now points to p */
*q = *q+1;
cout << *p;

如果我没记错的话,那也会输出54.

自从我使用指针以来已经有一段时间了(很多年),但是我知道如果p指向数组的开头(即p [0])并且我们将其递增(即p ++),那么p现在将指向p [1]。

我认为我们必须取消引用p才能获得该值。我们可以通过在指针前面加*来取消引用指针。

因此* p = 33,将p [0]更改为33.

我猜想要获取第二个元素,我们将使用*(p + 1),因此我们需要的语法将是:

cout << *(p+1)

或者

cout << *(++p)

我喜欢这样做:

&p[1]

对我来说,它看起来更整洁。

可以将C和C ++中的"指针类型"想象成是在CPU的内存空间中的字节(从字节0开始)上叠加了一个很长的逻辑单元行。每个单元的宽度(以字节为单位)取决于指针的"类型"。每种指针类型均以不同的单元格宽度放下一行。由于int的存储宽度为4个字节,因此" int *"指针将放置一行4字节的单元格。 "" double "放置每单元8字节的行;一个" struct foo *"指针放下一行,每个单元格的宽度等于单个" struct foo"的宽度。任何"事物"的"地址"是保存"事物"的行中的单元的字节偏移量(从0开始)。 指针算术基于行中的单元,而不是字节。 "(p + 10)`"是对" p"之后的第十个单元格的引用,其中单元格大小由p的类型确定。如果" p"的类型为" int",则" p + 10"的地址为p以后的40个字节;如果p是指向1000字节长的结构的指针,则" p + 10"是p之后的10,000字节。 (请注意,编译器会为结构选择一个最佳大小,该大小可能会比我们想象的要大;这是由于"填充"和"对齐"所致。所讨论的1000字节结构实际上可能每个单元占用1024字节,例如,因此" p + 10"实际上是p以后的10,240个字节。)