如何理解指针数组的地址?
How to understand address for array of pointers?
我有一个简单的程序:
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];
}
编译:
g++ test.cpp -g -fno-stack-protector -o test
使用GDB调试(变量破坏前中断):
(gdb) x p
0x7fffffffdfc0: 0x5556aed0
(gdb) x &p
0x7fffffffdfc0: 0x5556aed0
(gdb) x p+1
0x7fffffffdfc8: 0x5556aef0
(gdb) x &p+1
0x7fffffffdfd0: 0xffffe0d0
所以我的问题是:
- 为什么
p
和&p
一样?我觉得p
是数组的起始地址,即&p[0]
,而&p
存放的是地址的阵列。我以为他们没有任何关系。
- 那么
p
等于&p
,是什么定义了+1
的行为,为什么p+1
是&p[1]
,而&p+1
是int *p[2]
. 之后的下一个地址
当数组类型的标识符出现在除sizeof
、address-of
(&
)以外的表达式中或引用的初始化中时,它被转换为pointer
到第一个数组元素。因此,p
表示 &p[0]
.
对于 int *p[2]
表达式 &p
的类型是 int* (*)[2]
指向数组的指针 int
.
p+1
移动到下一个数组元素(等价于 &p[0] + 1
),增量为 sizeof(int*)
&p+1
移动到下一个数组。增量为 sizeof(p)
或 2 * sizeof(int*)
.
我有一个简单的程序:
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];
}
编译:
g++ test.cpp -g -fno-stack-protector -o test
使用GDB调试(变量破坏前中断):
(gdb) x p
0x7fffffffdfc0: 0x5556aed0
(gdb) x &p
0x7fffffffdfc0: 0x5556aed0
(gdb) x p+1
0x7fffffffdfc8: 0x5556aef0
(gdb) x &p+1
0x7fffffffdfd0: 0xffffe0d0
所以我的问题是:
- 为什么
p
和&p
一样?我觉得p
是数组的起始地址,即&p[0]
,而&p
存放的是地址的阵列。我以为他们没有任何关系。 - 那么
p
等于&p
,是什么定义了+1
的行为,为什么p+1
是&p[1]
,而&p+1
是int *p[2]
. 之后的下一个地址
当数组类型的标识符出现在除sizeof
、address-of
(&
)以外的表达式中或引用的初始化中时,它被转换为pointer
到第一个数组元素。因此,p
表示 &p[0]
.
对于 int *p[2]
表达式 &p
的类型是 int* (*)[2]
指向数组的指针 int
.
p+1
移动到下一个数组元素(等价于 &p[0] + 1
),增量为 sizeof(int*)
&p+1
移动到下一个数组。增量为 sizeof(p)
或 2 * sizeof(int*)
.