一道90%都会做错的指针题

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

640?wx_fmt=png640?wx_fmt=png

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

什么是指针?

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

#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 类型。有点拗口,我们画个图。640?wx_fmt=png

上图中 我们定义了一个变量 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的数组,这个数组是个什么鬼东西,我们知道,内存可以起一个别名,数组是连续几个同类型内存块的别名

640?wx_fmt=png

好了,我们再说下一个问题 ,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 *) 。只能偏移到数组的下一个位置。

640?wx_fmt=png

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

2,5

2,2


640?wx_fmt=jpeg

640?wx_fmt=png

扫码或长按关注

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python调用arcgis_arcgis python 调用工具两种两种方法

原博文 2019-09-20 11:26 − arcpy.Select_analysis("p","kk") arcpy.analysis.Select("p","kk1") ... 相关推荐 2019-12-18 20:28 − import time import wmi, zlib def get_cpu_info(): tmpdict {} tmpdict["CpuCores"] …

ibatis mysql 同时删多个表报错_MySQL中Multiple primary key defined报错的解决办法

MySQL中Multiple primary key defined报错的解决办法创建主键可以有两种方式:create table 表名(字段名 类型,字段名 类型,……primary key(name));或者是create table 表名(字段名 类型 primary key,字段名 类型,………

Android ANR视角InputDispatcher

作者:王小二前言有好多人向我咨询过Input ANR问题,说实话,我也是一直无法彻底的解释清楚,我下决心要彻底搞懂这块知识点。话不多说先上图一个event的正常流程InputReader线程1.InputReader线程一旦发现有新的event,判断…

频繁跳槽,这谁顶得住~

最近应该是校招的时候,相信很多人都面临择业的问题,正念同学的文章,记录了自己一个嵌入式工程师这几年找工作换工作的经历。加我好友的都知道,我这几天发了一个朋友圈,说不要乱跳槽,我想表达的是&#xff0…

java script object_javascript Object与Array用法

引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型的值是引用类型的一个实例。一、ObjectECMAScript中的对象其实就是一组数据和功能的结合。Object类型其实是所有它的实例的基础,换句话说,Object类型所有具…

Linux内核编程广泛使用的前向声明(Forward Declaration)

前向声明编程定律先强调一点:在一切可能的场景,尽可能地使用前向声明(Forward Declaration)。这符合信息隐蔽的原则。一个例子regmap那么前向声明究竟是个什么鬼?在内核写代码和看代码的童鞋,经常发现Linux内核里面充斥着这样的代…

Top 10 Project Management Software

转载于:https://www.cnblogs.com/shy1766IT/p/7082910.html

java 二维数组 floyd_Floyd算法(一)之 C语言详解

本章介绍弗洛伊德算法。和以往一样,本文会先对弗洛伊德算法的理论论知识进行介绍,然后给出C语言的实现。后续再分别给出C和Java版本的实现。弗洛伊德算法介绍和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短…

南拳北腿

昨晚,熬夜看了篮球综艺节目,《我要打篮球》,实在话,我是林书豪的球迷,所以我肯定是希望林书豪球队能获胜,最后也如我所愿,两场3v3,电光飞侠都是在处于被动的情况下完成自我救赎&…

C语言const 关键字

面试的时候,应该有遇到const相关的,毕竟也是学习中的一个知识点,看完我们这篇文章,我觉得你应该可以在面试中完完全全的吃透const这个点。const和变量const uint32_t hello 3;编译的时候,编译器就知道了 hello 这个变…

pandas 第一行_Pandas数据预处理相关经验

在这里记录一些平常用的pandas操作以供参考。学习相关操作的最好方法还是找官方的文档最好,否则就会产生百度1小时,查文档3分钟的尴尬处境,之前为了找python里类似 in 的操作搜了半天资料也没找到,结果文档里就是 isin 函数就好了…

单机 amp; 弱联网手游 防破解、金币改动 简单措施

单机 & 弱联网手游 防破解、金币改动 简单措施 手游经常使用破解方法 对于一个弱联网或者单机游戏,能够从下面方面去破解: 1、找得到存档文件的,直接破解改动存档文件。 2、找不到存档文件,就在游戏执行时借助一些软件来改…

Linux 内核通知链和例程代码

概念大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣。为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制。通知链表只能够在内核的子系统之间使用&#x…

faster rcnn resnet_RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比

RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比一.RCNN问题一:速度经典的目标检测算法使用滑动窗法依次判断所有可能的区域。本文则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上提取特征,进行判断。问题二…

啰嗦一二三

第一点之前有一个抽奖,抽取野火开发板的,我记得有很多人参加了,20号的时候,获奖的同学都主动找我填写了收获地址,但是有一个同学特别调皮,到今天都没有来找我,我等了好久好久,还是没…

go设置后端启动_为什么 Rubyists 应该考虑学习 Go

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言如今,越来越少的 Web 开发人员开始专注于 Ruby 之类的单一语言。我们针对不同的工作使用不同的工具。在本文中,Ayooluwa Isaiah 认为 Go 是 Ruby 的完美补充。…

生涯刚开始就要转会?

昨晚,12点快睡觉的时候,一个同学给我发来的问题,篇幅有点长,都是文字,看起来可能有点乏味,不过有耐性的同学还是瞄一下,应该很多人都有这样的迷茫期,我的解答也不一定完全正确&#…

Topaz Video AI 视频修复工具(内附安装压缩包win+Mac)

目录 一、Topaz Video AI 简介 二、Topaz Video AI 安装下载 三、Topaz Video AI 使用 最近玩上了pika1.0和runway的图片转视频,发现生成出来的视频都是有点糊的,然后就找到这款AI修复视频工具 Topaz Video AI。 一、Topaz Video AI 简介 Topaz Video…

python文本编辑器报错_notepad++编辑器中运行python程序时需要注意的编码格式

本篇文章给大家带来的内容是关于notepad编辑器中运行python程序时需要注意的编码格式,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 语言:python3.4 文本编辑器:notepad 报错:SyntaxErro…

我不建议大家随便跳槽

突然的留言 我的微信好友很多,经常也有一些同学给我留言一些问题,当然能回答的我肯定会回答了,但是如果是非常难的技术问题,我一般会说,我要请教一下身边的朋友,昨晚准备睡觉的时候,收到一个同…