🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
1. int main() 2. { 3. int a[4]={1,2,3,4}; 4. int* ptr=(int*)(&a+1); 5. int* ptr1=(int*)((long)a+1); 6. printf("%d %d\n",ptr[-1],*ptr1); 7. return 0; 8. }
int* ptr=(int*)(&a+1);
&a是整个数组的地址,&a跳过整个数组,(int*)(&a+1)转化为数组元素的地址,ptr[-1]就是*(p-1),表示就是a[3]==4。
int* ptr1=(int*)((long)a+1);
a是数组首元素的地址,(long)a+1将数组首元素地址转化为整形,然后地址数值+1,看一下内存怎样存储数组
所以* ptr1的值为0x02000000,十进制就为33554432
1. #include<stdio.h> 2. int main() 3. { 4. int a[5][5]; 5. int (*p)[4]; 6. p=a; 7. printf("%p %d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]); 8. return 0; 9. }
这里p是数组指针,它的类型是int(*)[4],与a的类型不匹配,所以看一下内存分布情况
所以&p[4][2]-&a[4][2]地址相减等于-4,整形打印就是-4
-4的原码:10000000000000000000000000000100
原码:1111111111111111111111111111111111111111011
补码:1111111111111111111111111111111111111111100
&p[4][2]-&a[4][2]地址打印就是1111111111111111111111111111111111111111100(0xfffffffffffffffc)
1. #include<stdio.h> 2. int main() 3. { 4. char* c[]={"ENTER","NEW","POINT","FIRST"}; 5. char** cp[]={c+3,c+2,c+1,c}; 6. char*** cpp=cp; 7. printf("%s\n",**++cpp); 8. printf("%s\n",*--* ++cpp +3); 9. printf("%s\n",*cpp[-2]+3);//(**(cpp-2)+3) 10. printf("%s\n",cpp[-1][-1]+1); 11. printf("%s\n",**cpp); 12. return 0; 13. }
首先我们得把c,cp,cpp对应的关系梳理出来
c[0] | c[1] | c[2] | c[3] | |||||
ENTER | NEW | POINT | FIRST | |||||
cp[0] | cp[1] | cp[2] | cp[3] | |||||
&c[3] | &c[2] | &c[1] | &c[0] | |||||
cpp | ||||||||
&cp[0] | ||||||||
printf("%s\n",**++cpp):
++cpp就是cp[1]的地址,*++cpp这样解引用就是c[2]的地址,再解引用就是“POINT:
printf("%s\n",*--* ++cpp +3):
++cpp就是cp[2]的地址,* ++cpp得到的是c[1]的地址,--* ++cpp得到的是c[0]的地址,*--* ++cpp这样解引用就是“ENTER”,*--* ++cpp +3就是“ER”。
printf("%s\n",*cpp[-2]+3):
**(cpp-2)+3,cpp就是cp[2]的地址,cpp-2就是cp[0]的地址,**(cpp-2)就是“FIRST”,**(cpp-2)+3就是“ST”
printf("%s\n",cpp[-1][-1]+1):
*(*(cpp-1)-1)+1,cpp是cp[2]的地址,cpp-1就是cp[1]的地址,*(cpp-1)就是c[2]的地址,*(cpp-1)-1就是c[1]的地址,*(*(cpp-1)-1)就是“NEW”,*(*(cpp-1)-1)+1为“EW”
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸