可恶的指针 |
#include
using namespace std;
int main ()
{
int i ;
int * q ;
int * a [10];
int * (* b [10]) [10];
int * (*(* p ) [10]) [10];
i = 100; q = & i ; a [1] = q ; b [1] = & a ; p = & b ;
cout <<p[0][1][0][1][0]<< endl ; // 输出 100
cout <<*(*(*(*(*p+1))+1))<< endl ; // 输出 100
} // 程序
a
a
a是一个具有
10
10
10个元素的数组,数组中每一个元素都是一个指向整形元素的指针
b
b
b是一个具有
10
10
10个元素的数组,该数组的每一个元素都是一个指针,并且指向一个具有
10
10
10个元素的数组,该数组的每一个元素都是一个指向整型数
p
p
p是一个指针,其指向一个具有
10
10
10个元素的数组,该数组每一个元素都是一个指针,指向一个具有
10
10
10个元素的数组,该数组每个元素都是一个指向整型元素的指针。
a和b的类型变量表达式
a
:
a
r
r
a
y
(
10
,
p
o
i
n
t
e
r
(
i
n
t
)
)
a: array(10,pointer(int))
a:array(10,pointer(int))
p
:
p
o
i
n
t
e
r
(
b
)
→
p
o
i
n
t
e
r
(
a
r
r
a
y
(
10
,
p
o
i
n
t
e
r
(
a
)
)
)
→
p
o
i
n
t
e
r
(
a
r
r
a
y
(
10
,
p
o
i
n
t
e
r
(
a
r
r
a
y
(
10
,
(
p
o
i
n
t
e
r
(
i
n
t
)
)
)
)
)
)
p:\\ pointer(b) →\\ pointer(array(10,pointer(a))) \\→pointer(array(10, pointer(array(10, (pointer(int))))))
p:pointer(b)→pointer(array(10,pointer(a)))→pointer(array(10,pointer(array(10,(pointer(int))))))
i = 100; q = & i ; a [1] = q ; b [1] = & a ; p = & b ;
p[0][1][0][1][0]
*(*(*(*(*p+1))+1))
p[0]=*p → p所指向的地址的内容即b的地址
p[0][1]=*(*p+1) → b的地址向右移一位容即b[1]对应的内容:&a
p[0][1][0]=*(*(*p+1)) → a的地址对应的内容
p[0][1][0][1]=*(*(*(*p+1))+1) → a的地址向右移一位即a[1]对应的内容:q=&i
p[0][1][0][1][0]=*(*(*(*(*p+1))+1)) → i地址对应的内容即100