C++ 数组指针,该数组中每个元素的内存空间信息存储在哪里?

C++ 数组指针,该数组中每个元素的内存空间信息存储在哪里?,c++,arrays,pointers,C++,Arrays,Pointers,例如: int *p; int a[2] = {1, 2}; p1 = a; void f(int *) { std::cout << "Integerpointer" << std::endl; } void f(char *) { std::cout << "Charpointer" << std::endl; } int i = 9; int * p = &i; f(p); 我想知道C++在哪里存储每个元素的内存空间信息?我是

例如:

int *p;
int a[2] = {1, 2};
p1 = a;
void f(int *) { std::cout << "Integerpointer" << std::endl; }
void f(char *) { std::cout << "Charpointer" << std::endl; }

int i = 9;
int * p = &i;

f(p);
我想知道C++在哪里存储每个元素的内存空间信息?我是说,当我这样做的时候:

cout << p << endl;

cout数组中的内存是连续的,因此递增指针将使您从一个元素到下一个元素

它知道要到达下一个元素需要在内存中走多远的方式取决于指针的类型,在本例中,它是一个
int*
,因此它知道要到达下一个元素需要增加
sizeof(int)

该数组中每个元素的内存空间信息存储在哪里

使用时:

int *p;
int a[2] = {1, 2};
p = a;
a
元素的内存在堆栈中。它们的内存是连续的
p
指向
a
的第一个元素

关于:

我可以得到该数组的第二个元素,不管该数组中的元素是什么类型的,以及单个元素对应的内存空间。该语言能够自动跳过特定的空间内存,以获得下一个元素的正确起始位置及其地址

是的,没错

从纯数值的角度来看

p+1 == p + sizeof(*p)

sizeof(*p)
可以在编译时计算。不需要任何运行时信息。不需要标记来表示元素的结束。

它不需要。C++没有关于变量类型的运行时信息。它只是将指针后面的数据解释为源代码中给定的类型。以以下代码为例:

int *p;
int a[2] = {1, 2};
p1 = a;
void f(int *) { std::cout << "Integerpointer" << std::endl; }
void f(char *) { std::cout << "Charpointer" << std::endl; }

int i = 9;
int * p = &i;

f(p);
编译器用源代码中匹配的函数调用替换
f()
。因此,底层数据的解释是在编译时完成的

要解决阵列问题,请执行以下操作:
编译器知道编译时元素的大小。然后在访问元素时调整指针添加,并将硬编码的大小放入机器代码中。如果您知道一点assambly,您可以查看assambly代码并看到这种效果。

它没有存储;这个问题的答案(关于分配/解除分配和实际跟踪内存,而不是在进行数组索引时仅通过元素的大小递增)是难以置信的依赖于实现的。关于它的一些背景知识,您可以阅读一下为什么
malloc/free
不接受大小参数。基本上,除非你真的需要知道它的魔力。我知道这是魔术,那里有很多魔术。但我对这一点非常好奇:)你是说
p+1
还是
p
?我记得在那一天,他们教数组的方法是让我们手动实现一种方法,即给定数组的字节视图,就可以为一维和二维数组计算索引的正确地址。这是一个很好的了解编译器在幕后做什么的方法。@0x499602D2,我本想使用
p+1
,但我想使用
=
而不是
=
。谢谢!
p+1=p+sizeof(*p)
的解释是让我对这个问题感到舒服的好方法。正如有人在评论中所说,它取决于实现。因此,我能理解吗?因为有很多种“重载操作”的实现,比如“+,-,++,-”,针对不同系统的指针,其中
p+1=p+sizeof(*p)
是一种可能的实现?@ZongyaoJin实际的数组索引并不真正依赖于实现;在我见过的任何实现中,它们总是分配在连续内存中,因此总是
p+sizeof(*p)
。然而,任何特定类型的
sizeof
返回的内容肯定取决于平台。