此指针的内存地址是什么

What is the memory address of this pointer?

本文关键字:地址 是什么 内存 指针      更新时间:2023-10-16

好的,所以在测试中我问了这个问题:

int* ptrA;    // assigned memory address 100
int a = 1;    // assigned memory address 600
ptrA = &a;
What is the memory address of ptrA + 2?

我以为是 606(int是 4 字节 + a的地址是 600 + 2 = 606,但显然答案是 608,我错过了什么才能做到这一点?

这是未定义的行为,表达式PtrA + 2是非法的。您只能对您拥有的指针进行指针算术,并且不能在您拥有的数组范围之外或范围之外的指针中添加或减去指针。

然而,我们仍然可以分析这一点(尽管由于 UB 而无用)。你假设a的地址是600 + 2,但事实并非如此,因为可能sizeof(int*)也是4,所以这变得600 + 4。所以你得到600 + 4 + 4 = 608.

实际上指针

上的算术运算是不同的。它们增加取决于数据类型的大小,所以如果给出一个地址,比如x,你必须要求x+ 2。(给定 x 是一个整数指针)则 ..

x+ 2 表示 ---- x + (sizeof(int))*2

如果 x 作为字符指针给出,则

x+2 表示 ---- x + (大小(字符))*2

谢谢。

在 C 中,x 是指针的x + y等效于 &x[y] 。假设你有

int abc[3] = {1,2,3}; 
int* ptr = &abc[0];

&ptr[2]ptr + 2)是3的地址,显然比1的地址多8个。

int* PtrA;    // assigned memory address 100
int a = 1;    // assigned memory address 600
What is the memory address of ptrA + 2? 

这个问题是模棱两可的。

如果问题是"什么是(ptrA的内存地址)+ 2?",那么你已经说ptrA内存地址为100(忽略PtrA != ptrA),并且在C和C++中将指针加2会以指向类型大小的倍数递增事物,因此如果int是32位,则最终结果是100 + 2 * 4 = 108。

如果问题是"(ptrA + 2)的内存地址是多少?",这意味着在ptrA变量和2中将值相加的结果,那么这是未定义的,因为没有显示ptrA的初始化,并且尝试从未初始化的内存中读取是未定义的行为。

您的期望和假定的答案表明预期的代码已经...

ptrA = &a;

。在评估ptrA + 2之前的某个时候。 如果这是真的,那么答案将是600 + 2 * sizeof(int),很可能是608。

在 C/C++ 中,指针算法使用指针指向的对象的大小。前任:

int* PtrA = (int*)600;

如果整数的大小为 4,则 PtrA+2 的值将为 608。

标准允许仅在数组内部或"在数组之后"进行指针运算。这意味着应该采取一定的谨慎措施。

我认为

,地址总是更多并不是真的。它也可以更少。可以肯定的是,假设 ptr 是指向整数数组 a 的基址的指针,那么 ptr+2 将指向数组的第 3 个元素。因此,如果数组的基址为 600,则地址可以是 600+2*(sizeofIint)),也可以是 600-2*sizeof(int);但无论如何,它将指向该数组的第 3 个元素。所以,我相信即使在数组的情况下,我们也不应该依赖直接地址。并且不应该对PTR + 2是否指向608或其他东西做出任何假设。

谢谢和问候,索拉布