关于C++:如果指针指向数组或对象,它的值是多少?

What is the value of a pointer if it is pointing to an array or an object?

我知道我的问题可能非常基本,但我想知道,在内存中获得多个单元的对象,比如数组和用户定义的对象(需要在内存中有多个单元,从而在内存中有连续地址的范围),对于这种对象,指针真正意味着什么?是C++中的变量,包含内存中这些对象的地址(逻辑上不是真的,因为这些对象在内存中占用了一个以上的单元格,因此具有连续地址的范围),或者说,指向这些对象的指针只是这些对象的开始地址(更合理)。

请帮助我理解;如果你不相信我对C++指针定义的解释,给我正确的解释。

In most C++ tutorials it said that pointers just contain the addresses of other variables in memory.


让我们说,你有一个变量a宣布initialized鸭类

1
int a = 5;

你创造的指针int和一点的两个a化妆用的地址:"&算子

1
int* pointer_to_a = &a;

的实际价值的pointer_to_a是解决在a冰在存储器中。但编译器都知道它的指针,所以你可以使用两个接入pointer_to_acontents of the a与解引用操作符*

1
2
3
*pointer_to_a = 10;
std::cout <<"a =" << a << '
'
;

首先将打印《10,当你看到我pointer_to_acontents of冰两10指指点点。


如果(AS的编译)知道安int冰(在这种特殊的制度)长4个字节,一个指针int告诉我只需要在"开始"的int冰:只需要读它,接下来的三个字节。

对数据结构larger状列阵,冰一样的威胁:如果知道在哪里我的阵列的开始,我知道,我可以访问每个后续元素市的大型综合项目的一个地址。例如,如果有一个int a[]出发来解决100个int冰,和4个字节,那么

a[32] = (address of a) + (32 * size of int) = 100 + 128 = 228228 231通SO字节整数是A [ 32 ]。

是什么让这两个冰更容易吗?是卷曲的,编译器使用不同大小的抽象数据类型中的美国。如果我在两个整数加1地址指针,实际上会增加城市4!这是因为极少极(几乎没有),我想读半个整数:它的有可能,我希望看一系列integers在转。


从这里

The memory of your computer can be imagined as a succession of memory
cells, each one of the minimal size that computers manage (one byte).
These single-byte memory cells are numbered in a consecutive way, so
as, within any block of memory, every cell has the same number as the
previous one plus one.

This way, each cell can be easily located in the memory because it has
a unique address and all the memory cells follow a successive pattern.
For example, if we are looking for cell 1776 we know that it is going
to be right between cells 1775 and 1777, exactly one thousand cells
after 776 and exactly one thousand cells before cell 2776.]1


这可能会帮助想象我们大学的存储器布局 在这里

当你specify(你也specify指针的指针类型,例如它会保持两个int * 在这个案例的编译器将储备(通常是4个字节的大小(int)和大的价值在小端字节/大- endian格式。

我认为你是正确的,这将有一个指针的启动细胞只有如果你当时说的P + +编译器将增点的两个4字节和一些其他的地址。

如果你想在下一个参考两个P细胞有两个冰淇淋指指点点的认为你可能需要读的地址(十六进制地址)和增量和deference信息。


一个数组,指针到底在相同的均值为别人为我做的一切。

A点位置的两个指针的对象(一)到底在unwind回复的两个指针的数组:反对这一对象也可能是个阵列),不多不少。它不知道这儿的size个阵列的对象有一个冰(与不治疗)。 它是可能的两个perfectly create a两个指针的值和一个单一的接入网络作为一个数组的大小一些,尽管这是告诉他们阱定义的和明智的(它可能会崩溃)。它也可能perfectly两个指针使用一个阵列尺寸10 5和存取的元素。再次,这是不可能会有意义和防止碰撞,但你从没有做它(除了与compiletime常数的指数,至少一些编译器警告的可能)。指针是不知道的。

一个结构,一个知道指针的位置的结构的存储器和NO,NO MORE的少。上顶上,编译器知道,额外的细节,如《胶印部成员这两个基地址。然而,这个信息是绑定的,你使用两种类型的指针解引用操作符(而不是两个指针本身!)。。。。。。。 因此,它是可能的两个普遍接入A A BananaCar对象的指针,如果你把你的Banana两个点A(铸造汽车城,城市交通事故,或算术)。当然,不做任何意义,但它是可能的。"不知道指针和一个差分,编译器将法案的"如果"。

1是的,如果它的一个数组的指针,编译器知道那阵的尺寸。所以你唯一的问题类型的正确性。你会得到一个编译错误想个assign阵列(5两个指针的数组(4,因为它们是不同的东西。但这是irrespective的指针。"还不知道指针的数组的大小,它还不知道是否有一个数组或数组的数组。你可以通过使用它的方式(或者可能两desastrous效应),和有没有逻辑,防止从做你的愤怒。