更改指向数组的指针以获取特定的数组元素
我了解指针和引用的整体含义(或者至少我认为我确实了解),我也了解当我使用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个字节。)