今天,在我们的一个小群里,一个同学发了一道题目给我看,这道题目应该是C语言面试的一股清流了,各种招聘笔试上都可以看到,我试着发到我的大群里去,发现有人对这个理解不是很深刻,所以再发出来,知识总是在不断的碰撞中提高的,同理,球技也是一样。

大家可以先猜测一下这两个程序的输出是什么?

什么是指针?

书籍看得比较多了,这个指针那个指针,但是我认为如果说到指针,不说变量,就有点耍流氓,所以我认为理解指针的基础就要理解它是一个变量,所以指针,可以理解为指针变量,再延伸出来,就是地址变量,可以存地址的一个变量,而且存的这个地址指向的类型也是有要求的

#include "stdio.h"    int main()
{   int i = 12;    int *p = &i;   printf("%d\n",sizeof(int *)); printf("%d\n",sizeof(p)); printf("%p\n",&p);
}

看上面的代码,p是一个指针变量,p存的是一个地址,p存的这个地址存的类型是 int 类型。有点拗口,我们画个图。

上图中 我们定义了一个变量 p ,所以编译器就必须要给这个p分配内存,如上图所示,这个p的内存是 0x1000,p是什么类型呢?从定义可以看,p的类型是 int *,所以说p只可以存 int * 类型的值,也就是一级指针,就是一级地址,也就是 i 的地址。

i 也是一个变量,这个变量的地址是 0x1001, 这个地址上存的值是 12。

地址本来是没有名字的,因为定义了变量,所以地址就对应有了一个别名,这个名字就代表了这个内存地址

弱弱问一句,声明有没有分配内存呢?

什么是数组?

我觉得指针和数组是不用比较的,我们比较的是指针变量和数组名,这两个东西才有比较的意义,数组是一类数据的集合,指针变量只能是一个地址变量,没必要折腾自己的大脑了。

#include "stdio.h" int main()
{   int array[5] = {1,2,3,4,5};    return (0);
}

我们定义了一个 array的数组,这个数组是个什么鬼东西,我们知道,内存可以起一个别名,数组是连续几个同类型内存块的别名

好了,我们再说下一个问题 ,array 是数组的名字,&array 获取的是这个数组的地址,而且这个地址的值等于 &array[0] 「首元素的地址」。

虽然数值相等,但是他们的含义是不一样的。

如果 &array +1 这个时候,地址偏移的是 &array + sizeof(array)

如果 &array[0] +1 这个地址偏移是 &array[0] + sizeof(array[0]) ,也就是偏移到地址 &array[1]上。

再看看上面的两个题目

我们再看看上面的题目

int *p = (int*)(&a +1);

这句代码执行后,p的值应该是 &a +sizeof(a)了。

但是下面这句代码就不一样了。

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

&a 赋值给 p 后,这个意义就不一样了,这时候,它的类型是 int* ,p+1 就是 p + sizeof(int *) 。只能偏移到数组的下一个位置。

所以这样说之后,大家都知道上面的输出结果了吗?

2,5

2,2


扫码或长按关注

回复「 加群 」进入技术群聊

一道90%都会做错的指针题相关推荐

  1. 支付宝二面:使用 try-catch 捕获异常会影响性能吗?90%都会答错

    不知道从何时起,传出了这么一句话:Java中使用try catch 会严重影响性能. 然而,事实真的如此么?我们对try catch 应该畏之如猛虎么? 一.JVM 异常处理逻辑 Java 程序中显示 ...

  2. 据说有99%的人都会做错的面试题

    这道题主要考察了面试者对浮点数存储格式的理解.另外,请不要讨论该题本身是否有意义之类的话题.本题只为了测试面试者相关的知识是否掌握,题目本身并没有实际的意义. 下面有6个浮点类型变量,其中前三个是fl ...

  3. String.intern() 1.8看完这篇再也不会做错这类题了

    前言   本文的测试环境是JDK1.8. String.intern()分析在文中偏后 一.创建字符串分析 1.直接使用双引号创建字符串 判断这个常量是否存在于常量池,   如果存在,    判断这个 ...

  4. 宁夏大学计算机考研论坛,很多人认为宁夏大学考研题普通人都会做,不如一起来做下试试...

    刚在别人的帖子下边,有很多人题很简单,自己不是学中文的,名词解释都能答的差不多,还各种瞧不起答不上来的人.那不如都来试试看看都能完整答出来几道题.. 感觉能答上来的的确厉害,我是真的佩服的这个,但是我 ...

  5. php和prp的区别,干细胞和PRP的区别,90%求美者都会理解错!

    原标题:干细胞和PRP的区别,90%求美者都会理解错! 版权声明:本文独家原创,任何媒体或网站未经书面授权不得转载,违者将追究法律责任. 很多妹子在咨询脂肪填充的时候,医生都会问要不要加PRP或者干细 ...

  6. 浙江大学远程教育学院计算机考试,浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx...

    浙江大学远程教育学院机试题 Windows操作题(共15分,若有做错请酌情 ....docx 第 PAGE 26 页 共 NUMPAGES 36 页 浙江大学远程教育学院机试题 Windows操作题( ...

  7. 90%的人都做错的用户画像,到底应该怎么做?

    前几天,有个搞运营的小伙伴向我吐槽,熬了几个夜做出来的用户画像被老板说垃圾.不管是市场人员.运营人员还是产品经理,都躲不开"用户画像",但经常听到伙伴们抱怨,这个词太大了,根本不知 ...

  8. 【2】二级C语言中那些易错的概念题

    本篇是这几天总结的C语言易错概念题,这些题往往就是因为概念不清而做错,而当我们对概念非常熟练时,又可以秒选.这些题其实都是强行记住就行了,概念不清也就是没记住嘛,因为这种题失分简直就太不值得了,因此有 ...

  9. C#学习小记14求助一道让我头疼的C#小题

    求助:一道让我头疼的C#小题! 1说出以下每个场景出错的准确原因? 假定Professor和Student都是实现ITeacher接口的类 场景一: Professor p; Student s=ne ...

最新文章

  1. 第二课.初识机器学习
  2. 即构推出小程序连麦直播方案,与iOSAndroid APP互通连麦!
  3. C++文本处理_文件读写
  4. 苹果7plus元件分布图_苹果iphone7 plus手机拆解全过程评测 iphone7 plus拆机图解教程...
  5. 面向对象的软件工程应用浅研
  6. spring data jpa 分页查询
  7. python标准日期正则表达式_Python 正则表达式验证传统日期
  8. file_table.c 文件分析 linux1_0\linux\fs\file_table.c
  9. 阿里云DLA新功能来袭 查询MongoDB嵌套字段更方便
  10. SQL插入数据的方法
  11. 几种可以不用过于投入精力去交往的人脉
  12. 每个创始人都需要了解的来自 Y Combinator 的 13 个见解
  13. C++动态数组的创建
  14. 自己实现一个简易web服务器
  15. python默认数据转换_Python之数据转换
  16. 【小程序】小程序多次扫描不同二维码参数不生效问题
  17. ResNet50是什么
  18. JAVA泛型特例化_这个大学生,抢先go2实现了go的泛型
  19. 高通平台android开发总结
  20. 第一篇博客-学习Markdown

热门文章

  1. About SOuP
  2. linux的mysql小记
  3. nginx 电子书_13本免费的电子书,拿走,不谢
  4. loading gif 透明_搞笑GIF:有这样的女朋友下班哪里都不想去
  5. tornado学习笔记day02-进阶与提升
  6. JavaWeb笔记02-Tomcat
  7. HTML中Head头
  8. Freeswitch之ASR(语音识别)总结大全
  9. GD32 使用stm32 固件库
  10. Linux桌面需要强制访问控制,RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...