-2

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

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

在大多数 C++ 教程中,它说指针只包含内存中其他变量的地址。

4

5 回答 5

3

假设您a声明和初始化了一个变量,例如

int a = 5;

然后创建一个指针并使 int指向使用a地址运算符&

int* pointer_to_a = &a;

The actual value of the pointer_to_a is the address of where a is in memory. But the compiler knows it's a pointer, so you can use pointer_to_a to access the contents of a with the dereference operator *:

*pointer_to_a = 10;
std::cout << "a = " << a << '\n';

The above will print 10, as you set the contents of where pointer_to_a is pointing to 10.

于 2013-08-19T09:11:08.220 回答
2

If I (as the compiler) know that an int is (on this particular system) 4 bytes long, a pointer to an int need only tell me where the "start" of the int is: I just need to read it and the next 3 bytes!

For larger data structures like arrays, the same is true: if I know where my array starts, I know that I can access each subsequent element by adding the size of one item to the address. For example, if I have an int a[] starting at address 100, and an int is 4 bytes, then

a[32] = (address of a) + (32 * size of int) = 100 + 128 = 228 So bytes 228 through 231 are the integer at a[32].

What makes this slightly easier to use is that the compiler abstracts the different sizes of the data types away for us. If I add 1 to my integer pointer, the address actually increases by 4! This is because I very rarely (almost never) want to read half an integer: it's more likely that I wish to look at a series of integers in turn.

于 2013-08-19T09:26:39.050 回答
1

这里

可以将计算机的内存想象为一系列内存单元,每个单元都是计算机管理的最小大小(一个字节)。这些单字节存储单元以连续的方式编号,因此,在任何内存块中,每个单元的编号都与前一个单元加一相同。

这样,每个单元都可以很容易地在内存中定位,因为它有一个唯一的地址,并且所有的内存单元都遵循一个连续的模式。例如,如果我们正在寻找单元格 1776,我们知道它将位于单元格 1775 和 1777 之间,恰好是 776 之后的一千个单元格,以及单元格 2776 之前的一千个单元格。] 1

于 2013-08-19T09:09:58.040 回答
0

This might help to imagine the memory layout of OS Here

when you specify a pointer you also specify the type pointer it will hold to e.g. int* In this case compiler will reserve 4 bytes (usually the size of int) and store the value in little-endian/big-endian format.

I think you are correct that it will have a pointer to the starting cell only and if you say p++ then compiler will increment 4 bytes and point to some other address.

If you want to refer to the next cell p is pointing to then think you might need to read the address (HEX address) and increment and deference it.

于 2013-08-19T09:30:44.913 回答
-1

对于数组,指针的含义与其他所有内容完全相同。

一个指针正好指向一个对象的位置(作为对 unwind 的指向数组指针的反对意见的回应:这个对象也可能是一个数组),不多不少。如果有一个对象数组(并且不在乎),它不知道对象数组的大小。1
完全有可能创建一个指向单个值的指针并将其作为某个大小的数组访问,尽管这既不明确也不明智(它可能会崩溃)。也完全可以使用指向大小为 5 的数组的指针并访问第 10 个元素。同样,这没有任何意义并且可能会崩溃,但没有什么能阻止你这样做(除了编译时常量索引,至少一些编译器可能会发出警告)。指针不知道。

对于结构,指针知道结构在内存中的位置,不多也不少。最重要的是,编译器知道其他细节,例如成员到这个基地址的偏移量。但是,此信息绑定到用于取消引用指针的类型(而不是指针本身!)。
因此,如果您让指针指向汽车(通过强制转换、意外或算术),通常可以Car通过指针访问对象。当然,这没有任何意义,但这是可能的。指针不知道有什么区别,编译器会“像”一样行事。BananaBanana


1是的,如果它是指向数组的指针,编译器就知道该数组的大小。但这仅对类型正确性很重要。尝试将 5 数组分配给 4 数组指针时会出现编译错误,因为它们是不同的东西。但这与指针无关。指针仍然不知道数组的大小,它仍然不知道是否存在一个数组或数组数组。您仍然可以以任何一种方式使用它(可能会产生灾难性的影响),并且没有任何逻辑可以防止您造成伤害。

于 2013-08-19T09:10:43.400 回答