「题解」日常遇到指针面试题

 

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 

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]
ENTERNEWPOINTFIRST
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”

 

   🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸  

  • 22
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值