🐶博主主页:@ᰔᩚ. 一怀明月ꦿ
❤️🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章
🔥座右铭:“不要等到什么都没有了,才下定决心去做”
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
int main() { int a[4]={1,2,3,4}; int* ptr=(int*)(&a+1); int* ptr1=(int*)((long)a+1); printf("%d %d\n",ptr[-1],*ptr1); return 0; }
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
#include<stdio.h> int main() { int a[5][5]; int (*p)[4]; p=a; printf("%p %d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]); return 0; }
这里p是数组指针,它的类型是int(*)[4],与a的类型不匹配,所以看一下内存分布情况
所以&p[4][2]-&a[4][2]地址相减等于-4,整形打印就是-4
-4的原码:10000000000000000000000000000100
原码:1111111111111111111111111111111111111111011
补码:1111111111111111111111111111111111111111100
&p[4][2]-&a[4][2]地址打印就是1111111111111111111111111111111111111111100(0xfffffffffffffffc)
#include<stdio.h> int main() { char* c[]={"ENTER","NEW","POINT","FIRST"}; char** cp[]={c+3,c+2,c+1,c}; char*** cpp=cp; printf("%s\n",**++cpp); printf("%s\n",*--* ++cpp +3); printf("%s\n",*cpp[-2]+3);//(**(cpp-2)+3) printf("%s\n",cpp[-1][-1]+1); printf("%s\n",**cpp); return 0; }
首先我们得把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”
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸