目录

第一题:

第二题:

第三题:

第四题:

第五题:

第六题:

第七题:

第八题:


第一题:

int main()
{int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);printf( "%d,%d", *(a + 1), *(ptr - 1));return 0;
}

预测其输出结果。

题解思路:指针题是需要画图的,不画图思路是绕不出来的。下图就是a数组的内存布局。

int * ptr =(int *)(&a + 1);ptr所指如图:

很多同学可能不太明白:数组名为一个数组的首元素地址,但除两种情况:

1.&+数组名——————————————这里就表示是整个数组的地址。

2.sizeof(数组名)——————————   这里表示的是整个数组所占的字节数。

回到题目,(&a+1)中的1的意思就是步距为一个数组,在首元素地址的基础上加上了一整个数组的字节。

接下来看看printf()中的a+1、ptr-1:

那么答案一目了然:分别是第二个元素——2,与覅五个元素——5.

第二题:

struct Test
{int Num;char *pcName;short sDate;char cha[2];short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

思路与题解:

0x开头的是十六进制数。

在第一个printf()中p+0x1,一个Test结构体占20个字节,且p是struct Test *p类型,p每次加上一个1都要移动对应的20字节(详情请见初级指针的指针与指针类型).又因为是十六进制,20=0x14,所以p+0x1=0x100014.

在第二个printf()中(unsigned long)p+0x1,在这里p先由指针变量被强制类型转换为无符号long类型,因此p+0x1就是普通的整数相加,得到0x100001。然后%p在将p的数据以地址的形式打印出来了。

在第三个printf()中,p被再次转换成指针,但这次是以无符号整型的形式。unsigned int *就限定了每次指针访问的空间为四个字节。所以p+1的结果为0x100004

第三题:

int main()
{int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf( "%x,%x", ptr1[-1], *ptr2);return 0;
}

与题一同理:

ptr1:由int * ptr1=(int *)(&a+1);画出下图:

ptr1[-1]其实就相当于*(ptr1-1)。因为其实‘[]’与’*‘的功能是一样的。(详情见七千字详解操作符)

ptr2:

但是我们仔细看一下 int *ptr2 = (int *)((int)a + 1);中数组名a被强制转换为int类型的了。所以a+1只能向前移动一个字节。为了更好的观察我把这部分的图化成这个形式。(因为vs编译器是小端存储,左移这里的数据是01000000而不是00000001)

(int)a+1往后移动了一个字节如下图 :

这就是ptr2所指向的数据。

综上所述,答案为:0x02 00 00 00,00 00 00 04.

第四题:

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];printf( "%d", p[0]);return 0;
}

思路与答案:

这里其实用到了逗号表达式(详情见七千字详解操作符)与二级数组。

其实在a[3][2]中的数据为:

a指向

p=a[0]指向

所以答案是1.

第五题:

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;
}

思路与答案:

这个就是a[5][5]的布局,其中的数字代表帝即位元素。

a[5][5]:

先分析a[4][2],a[4][2]也等效于*(*(a+4)+2),你看哪种便于理解。如下图:

p[4][2]:

由int (*p)[4]得出:p为int [4]类型的指针,那么p就指向一个有四个元素的数组。由此可得p+1一次会移动四个元素:

&p[4][2] - &a[4][2]的值为相差的元素个数,因此&p[4][2] - &a[4][2]=-4

但是这里还需要我们谈一下:

&p[4][2] - &a[4][2]得出的整数结果是-4,-4在内存中存储的是一个二进制的补码,原理如下

因此我们内存中的-16是这样的

原码:1000 0000 0000 0100

反码:1111 1111 1111 1011

补码:1111 1111 1111 1100

因为%p是无符号数,所以 %p直接提取内存中的补码:0xfffffffc

因为%d是输出有符号整数,所以要将补码重新转成原码才输出:-4.

第六题:

int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}

思路与题解:

aa数组的内存步距如下:

aa指向第一行的地址:

&aa去除的是整个数组的地址,所以&aa+1如下图:

aa+1则会指向第二行的数据:

所以:

 答案呼之欲出:10,5

第七题:

这是一道阿里巴巴的笔试题:

#include <stdio.h>
int main()
{char *a[] = {"work","at","alibaba"};char**pa = a;pa++;printf("%s\n", *pa);return 0;
}

思路与题解:

pa++如下图:

因此答案为:“at”

第八题:

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);printf("%s\n", cpp[-1][-1]+1);return 0;
}

思路与题解:

指针间的关系图如下:

**++cpp就等效于*(*(cpp+1)) 得到如图:

顺着指针得出:POINT

*--*++cpp+3等效于*(*(cpp+1)+1)+3,我们从内到外分析,

由cpp+1得到如图:

又*(cpp+1)+1得到:

*(*(cpp+1)+1)解出来是c[0]的地址,*(*(cpp+1)+1)+3就是这样的。

因此*(*(cpp+1)+1)+3打印出来就是ER。

*cpp[-2]+3:

*cpp[-2]+3相当于:**(cpp-2)+3得到下图:

由此可见答案为:ST

八道超经典指针面试题(三千字详解)相关推荐

  1. flutter开发视频播放器,69个经典安卓面试题和答案详解,下载量瞬秒百万

    这篇文章最近很火,我也有一些自己的看法:现在去很多公司面试,除了你具备基本的能够写一个高性能app的能力后,一般都会在自己的app里面加一些现有的相对较666的技术,这些技术我们称之为开源框架. 比如 ...

  2. 69个经典安卓面试题和答案详解,赶紧收藏起来!

    一.java面试题 熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,甚至要你知道有哪些不足,怎么改进,还有一些java有关的一些算法,设计模式等等. (一 ...

  3. 矩阵与高斯消元【矩阵乘法,高斯消元求线性方程组,求行列式】 全网最详,附例题与姊妹篇 一万三千字详解

    (详解)矩阵快速幂详解与常见转移矩阵的构造_秦小咩的博客-CSDN博客_矩阵快速幂转移矩阵 目录 矩阵乘法 矩阵快速幂 伪代码模板 例题一 例题2 例题三 例题四 高斯消元 整形高斯消元 浮点型高斯消 ...

  4. 这八道经典指针笔试题你都会做嘛?

    本文详细介绍了八大指针经典笔试题,内涵盖指针大部分的用法, 全部了解掌握其原理之后对指针的学习大有帮助!!! 对指针掌握 也就掌握了内存,C语言也就没有什么更绕的了 详解八道经典指针笔试题 一.八道经 ...

  5. 李洪强iOS经典面试题156 - Runtime详解(面试必备)

    李洪强iOS经典面试题156 - Runtime详解(面试必备)   一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...

  6. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  7. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  8. c语言50到100套,c语言51-100套试题答案及详解.pdf

    c语言51-100套试题答案及详解 2 double ave=0.0; 第 51 套 试题答案及详解 3 *n=0; 4 for(i=0; i 5 ave /=N; /* 计算平均值 */ 一.程序填 ...

  9. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

最新文章

  1. 【每日一题】剑指 Offer 10- I. 斐波那契数列
  2. Tableau实战系列浏览 Tableau 环境(八) -tableau文件类型、语言和区域设置以及图标
  3. 2020/Province_C_C++_A/F/成绩分析
  4. csv 20位数据 如何打开可以预览完整数字_干货Python Pandas 做数据分析之玩转 Excel 报表分析...
  5. unicode解码php,PHP解码unicode编码的中文字符
  6. 外卖小哥高考623分!查分后淡定送外卖
  7. 常用JS积累之获取节点高度(基于浏览器)
  8. linux curl 命令(转)
  9. Java笔记(14):常用对象--正则表达式、GC
  10. [转载]如何捕获控制台消息
  11. 15条SQLite3语句
  12. Qt-QThread
  13. Windows系统备份
  14. 【数据结构】AOE网——关键路径
  15. Mushroom Classification(蘑菇分类数据集)
  16. 自行委托的鉴定意见可以作为审理依据
  17. 化繁从简,别让思维打了结
  18. 10 年工作经验的求职经历
  19. deno计算机语言什么意思,一篇文章告诉你什么是Deno!
  20. 台式计算机的配置清单表格,电脑配置清单表格,为你分别介绍不同价位的三种配置清单...

热门文章

  1. 短信验证,图形验证码校验
  2. python自动售货机_Python:自动售货机
  3. 算法设计(algorithm Design)官方配套课件
  4. 针对某软件系统的测试论文,计算机软件论文:软件可靠性及其测试分析
  5. C语言中的选择结构语句
  6. 【dvwa】--SQL注入
  7. 调用layoutSubviews一定要注意别忘了调用父类
  8. JavaWeb:Servlet生命周期
  9. vue实现 地图只显示几个省份
  10. 分析根文件系统中的目录结构