- 第一题
- 第二题
- 第三题
- 第四题
- 第五题
- 第六题
- 第七题
- 第八题
#include第二题#include int main() { int a[5] = {1,2,3,4,5}; int* ptr = (int*)(&a + 1);//&a取得整个数组额地址,&a+1跳过整个数组 //数组指针强类型转化为整形指针 printf("%d,%dn",*(a+1),*(ptr-1));//指针的加减看指针类型ptr为整形指针,所以 ptr-1指向数组的最后 return 0; }
#include第三题#include struct Test { int Num; char* pcName; short sDate; char cha[2]; short sBa[4]; }* p; //假设P的值为0x100000 //已知结构体test类型的变量大小是20个字节 int main() { p = (struct Test*)0x100000; printf("%pn",p+0x1);//00100014 p是结构体指针,p+1跳过整个结构体 //00100000+00000014=00100014 printf("%pn",(unsigned long)p+0x1);//00100001 p的指针类型转化为整形+1就是单纯加1 printf("%pn",(unsigned int*)p+0x1);//00100004 p转换为整形指针,P+1就是走过4字节 return 0; }
#include#include int main() { int a[4] = {1,2,3,4}; int* ptr1 = (int*)(&a+1);//&a取得整个数组额地址,&a+1跳过整个数组 int* ptr2 = (int*)((int)a+1); printf("%xn",ptr1[-1]);//4 ptr[-1]==*(ptr+(-1))==*(ptr-1) //数组指针强类型转化为整形指针ptr-1,指向最后一个元素 printf("%xn",*ptr2);//2 00 00 00 注意小端存储 return 0; }
#include第五题#include int main() { int a[3][2] = {(0,1),(2,3),(4,5)};//注意打括号内是小括号,并不是大括号以及逗号运算符的使用 //a[3][2]{(0,1),(2,3),(4,5)}=={1,3,5}=={1,3,5,0,0,0}={{1,3,5}, // {0,0,0}} int* p = a[0];//p是第一行数组的的指针 printf("%dn",p[0]);//p[0]==第一行第一个元素的值 return 0; }
#include第六题#include int main() { int a[5][5]; int(*p)[4]; p = a; printf("%p,%dn",&p[4][2]-&a[4][2], &p[4][2] - &a[4][2]); }
#include第七题#include int main() { int aa[2][5] = {1,2,3,4,5,6,7,8,9,10}; int *ptr1 = (int*)(&aa + 1);//&aa代表整个数组的地址,&aa+1:跳过整个数组 int *ptr2 = (int*)(*(aa + 1));//aa代表数组的首元素,首元素是一个一维数组; //aa+1:第二行首元素的地址 //*(aa+1) 第二行第一个元素 printf("%dn",*(ptr1-1));//10 printf("%dn",*(ptr2-1));//5 return 0; }
#include第八题#include int main() { char* a[] = {"work","at","alibaba"}; char** pa = a; pa++; printf("%sn",*pa); return 0; }
#include#include int main() { char* c[] = {"ANTER","NEW","POINT","FIRST"}; char** cp[] = {c + 3,c + 2,c + 1,c}; char*** cpp = cp; printf("%sn",**++cpp);//POINT //cpp+1指向c+2,两次解引用后找到POINT printf("%sn", *--*++cpp + 3);//ER //++cpp:cpp指向c+1 //*(++cpp):得到c指针数组的第二个元素的指针的内容 //--(*(++cpp)):第二个元素指针-1,得到第一个元素指针的内容 //*(--(*(++cpp))):解引用得到ENTER //*(--(*(++cpp)))+3:指向T,输出TR printf("%sn",*cpp[-2]+3);//ST //注意cpp到目前为止还是指向c+1,cpp[-2]指向的地址内容变化,cpp的指向并未变化 //*cpp[-2]==*(*(cpp+(-2))) 所以*cpp[-2]指向,c+3,得到的是FIRST //*cpp[-2]+3指向S printf("%sn",cpp[-1][-1]+1);//EW //注意cpp到目前为止还是指向c+1 //cpp[-1][-1]+1 == *(*(cpp-1)-1)+1 //*(cpp-1)指向c+2; //*(*(cpp-1)-1)指向c[2]的内容; //*(*(cpp-1)-1)+1指向NEW中的N return 0; }



