此指针的内存地址是什么
What is the memory address of this pointer?
好的,所以在测试中我问了这个问题:
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或其他东西做出任何假设。
谢谢和问候,索拉布
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- 是什么原因导致指定为RtlvalidateHeap的无效地址
- 在 Xcode 中工作的 CMake 中启用地址清理器的正确方法是什么
- 数组与其地址之间的关系是什么?
- 将绝对地址强制转换为指针变量的现代C++方法是什么?
- 跳过的内存地址是什么?
- C++:维护有序的ip地址表的最快方法是什么
- 此指针的内存地址是什么
- x 在变量地址中的意义是什么?
- 函数从堆栈返回的地址是什么
- 指针地址的含义是什么
- 堆栈上的线程返回地址是什么
- 为什么地址运算符是C++类的默认成员,它是什么
- 在执行函数指针时,使用运算符地址与不使用运算符地址的目的是什么
- (C++内存管理)如果我们有一个 int x = 1234,并且 int &y = x...那么堆栈上 y 的地址是什么?
- 打印成员函数地址的最简单方法是什么?
- 当获取一个地址时,模板类型(类/函数)的实例化规则是什么?
- 空指针的地址是什么