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

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

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

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,看一下内存怎样存储数组

97A2DD17-FF0C-44E1-8A25-1B3F97DDF4F0.png

 

所以* 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的类型不匹配,所以看一下内存分布情况

758BCFDF-FECE-478C-932C-0D2D0C01731B.png

所以&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”

 

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



相关文章
|
7月前
|
C++
C/C++工程师面试题(指针篇)
C/C++工程师面试题(指针篇)
108 0
|
7月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
2月前
|
编译器 C语言
经典左旋,指针面试题
文章介绍了两种C语言实现字符串左旋的方法,以及如何使用C语言对整数数组进行奇偶数排序。通过实例演示了如何使用函数reverse_part和leftRound,以及在swap_arr中实现数组元素的重新排列。
31 0
|
2月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
7月前
|
Java Go
Golang深入浅出之-Go语言指针面试必知:理解与使用指针
【4月更文挑战第21天】Go语言中的指针允许直接操作内存,常用于高效数据共享和传递。本文介绍了指针的基础知识,如声明、初始化和解引用,以及作为函数参数使用。此外,讨论了`new()`与`make()`的区别和内存逃逸分析。在结构体上下文中,指针用于减少复制开销和直接修改对象。理解指针与内存管理、结构体的关系及常见易错点,对于面试和编写高性能Go代码至关重要。
107 2
|
7月前
|
编解码 缓存 安全
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
【C/C++ 泡沫精选面试题03】谈谈C/C++ 智能指针?
90 1
|
7月前
|
存储 C语言
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
c语言中strlen与sizeof的区别(指针面试题详解帮你深度区分!)
|
7月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
91 1
|
7月前
|
C++
面试题:常量指针和指针常量?
面试题:常量指针和指针常量?
50 0
|
7月前
|
C++
面试题:如何避免野指针?
面试题:如何避免野指针?
98 0