好的,所以在测试中我问了这个问题:
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,我错过了什么才能使这个真实?< / p>
答案 0 :(得分:5)
这是未定义的行为,表达式PtrA + 2
是非法的。您只能对您拥有的指针进行指针运算,并且不能在您拥有的数组范围之外的指针或超出范围的指针之间添加或减少指针。
我们仍然可以分析这个(虽然没用,因为UB)。您假设a
的地址为600 + 2
,但事实并非如此,因为可能sizeof(int*)
也是4
,因此会变为600 + 4
。所以你得到600 + 4 + 4 = 608
。
答案 1 :(得分:3)
实际上指针上的算术运算是不同的。它们的增加取决于数据类型的大小,所以如果给出一个地址,则说x和u必须要求x + 2 ..(给定x是整数指针)然后..
x + 2表示---- x +(sizeof(int))* 2
如果x作为char指针给出,那么
x + 2表示---- x +(sizeof(char))* 2
感谢。
答案 2 :(得分:1)
在C中,x + y
其中x
是一个指针,相当于&x[y]
。假设你有
int abc[3] = {1,2,3};
int* ptr = &abc[0];
&ptr[2]
(ptr + 2
)是3
的地址,显然比1
的地址多8个。
答案 3 :(得分:1)
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),并将2添加到a C和C ++中的指针以指向类型的大小的倍数递增,所以如果int
是32位,那么最终结果是100 + 2 * 4 = 108。
如果问题是“(ptrA + 2)的内存地址是什么?”,意思是在ptrA变量和2中添加值的结果,那么这是未定义的,因为ptrA
没有初始化显示并尝试从未初始化的内存中读取它是未定义的行为。
您的期望和假设的答案表明目标代码已经......
ptrA = &a;
......在评估ptrA + 2
之前的某个时间。如果这是真的,那么答案将是600 + 2 * sizeof(int)
,这很可能是608。
答案 4 :(得分:0)
在C / C ++中,指针算术使用指针指向的对象的大小。例如:
int* PtrA = (int*)600;
PtrA+2
的值为608,前提是整数的大小为4。
标准允许仅在数组内部或“在数组之后”进行指针运算。这意味着应该特别小心。
答案 5 :(得分:0)
我认为,地址永远不会更多。它也可以少一些。可以肯定的是,ptr是指向整数数组a的基地址的指针,然后ptr + 2将指向数组的第3个元素。因此,如果数组的基址是600,那么地址可以是600 + 2 *(sizeofIint)),也可以是600-2 * sizeof(int);但无论如何,它将指向该数组的第3个元素。所以,我相信即使在数组的情况下,我们也不应该依赖直接地址。并且不应该对ptr + 2是否指向608或其他东西做出任何假设。
谢谢&amp;问候, SAURABH