我有一个简单的程序:
int main(){
int *p[2];
p[0] = new int;
p[1] = new int;
*p[0] = 10;
*p[1] = 12;
delete p[0];
delete p[1];
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ test.cpp -g -fno-stack-protector -o test
Run Code Online (Sandbox Code Playgroud)
使用 GDB 调试(在变量销毁前中断):
(gdb) x p
0x7fffffffdfc0: 0x5556aed0
(gdb) x &p
0x7fffffffdfc0: 0x5556aed0
(gdb) x p+1
0x7fffffffdfc8: 0x5556aef0
(gdb) x &p+1
0x7fffffffdfd0: 0xffffe0d0
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
p和&p?一样?我认为p是指数组的起始地址,即&p[0]while&p存放数组的地址。我以为他们没有任何关系。pequals &p,什么定义了行为+1?为什么p+1是&p[1],但是&p+1是之后的下一个地址int *p[2]。当数组类型的标识符出现在除sizeof、address-of( &) 或引用初始化以外的表达式中时,它会转换为pointer第一个数组元素。因此,p意味着&p[0].
对于int *p[2]表达式的类型&p是int* (*)[2]指向 2 个指针的数组的指针int。
p+1&p[0] + 1以增量移动到下一个数组元素(等效)sizeof(int*)
&p+1移至下一个数组。增量为sizeof(p)或2 * sizeof(int*)。
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |