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

我的问题如下:

如果我要使用cout << &p,它会显示<!>“虚拟内存位置<!>”;的p。 有没有办法可以操作这个<!>“虚拟内存位置?<!>

例如,以下代码显示了int s。

的数组

如果我想显示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+1将引用一个int*进一步的地址。你想要做的是

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

现在你做的时候

cout << *p;

您将获得54.不同之处在于,<=>包含整数数组开头的地址,而<=>是地址。要移动一个项目,您需要进一步指向 int数组,而不是进一步指向堆栈,这就是<=>所在的位置。

如果您只有<=>,那么您需要执行以下操作:

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个字节。 A "double *"规定每单元行8字节;一个"struct foo *"指针放下一行,每个单元格的宽度为单个"struct foo",无论是什么。 <!>“;地址<!>”;任何<!> quot; thing <!> quot;是保持<!> quot; thing <!>的行中单元格的字节偏移量,从0开始。

指针算法基于行中的单元格,而不是字节。 <!>“; *(p+10) <!>”;是对第10个单元格的引用,其中单元格大小由p的类型确定。如果<!>的类型为“p <!>”;是<!>“int <!>”;,地址<!>“p + 10 <!>”;是p超过40个字节;如果p是指向1000字节长的结构的指针,<!>“p + 10 <!>”;是p超过10,000个字节。 (注意,编译器可以选择一个结构的最佳大小,该大小可能比你想象的要大;这是由于<!> quot; padding <!>;和<!> quot; alignment <!>例如,所讨论的1000字节结构实际上可能需要每个单元1024个字节,所以<!>“p + 10 <!>”实际上是p的10,240个字节。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top