int i = 100;
int* p = &i;
int**p1 = &p;
int***p2 = &p1;
int****p3 = &p2;
int*****p4 = &p3;
int******p5 = &p4;
printf("%d %d \n",*(*(*p2)),p2[0][0][0]);
printf("%d %d \n",*(*(*(*(p3)))),p3[0][0][0][0]) ;
printf("%d %d\n",*(*(*(*(*(p4))))),p4[0][0][0][0][0]);
printf("%d %d\n",*(*(*(*(*(*(p5)))))),p5[0][0][0][0][0][0]);
运行结果:
总结指针特性:
1、任何变量前面都可以加一个或多个* 加上*以后就是一个新的类型
2、&表达式做取地址用途,那么它会生成一个在原数据类型的基础上多一个*的类型,如 &p2 操作 p2原类型是 int***,那么给&p2表达式赋值的时候必须用一个新的类型 int****类型来接收
3、不管多少*的变量类型数据宽度都是4个字节(32位的机器上)
4、++/-- 根据自身类型 加或减的值去掉一个星号后的宽度
5、int* p p的类型是 int* 对变量p加*操作的类型就是去掉一个*的类型 如p2 类型是int*** 那么*p2的类型就是int**仍然是4字节宽度
int i = 100;
010D4CB8 mov dword ptr [i],64h
int* p = &i;
010D4CBF lea eax,[i]
010D4CC2 mov dword ptr [p],eax
int**p1 = &p;
010D4CC5 lea eax,[p]
010D4CC8 mov dword ptr [p1],eax
int***p2 = &p1;
010D4CCB lea eax,[p1]
010D4CCE mov dword ptr [p2],eax
int****p3 = &p2;
010D4CD1 lea eax,[p2]
010D4CD4 mov dword ptr [p3],eax
int*****p4 = &p3;
010D4CD7 lea eax,[p3]
010D4CDA mov dword ptr [p4],eax
int******p5 = &p4;
010D4CDD lea eax,[p4]
010D4CE0 mov dword ptr [p5],eat
文章出自 123``blog
网友评论