c语言指针改良,重新认识C语言指针(上)(示例代码)

? 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采

本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。

https://github.com/midou-tech/articles

点关注,不迷路!!!

序言

指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。

为什么要学习指针?

有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子

Object obj= new Object();

Object sec= obj;

sec = new Object();

如果你去仔细研究他们的行为,就会发现 obj, sec 都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是 Java 的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。

? 继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。

指针可以直接操作变量地址,所以很灵活。

指针操作会减少很多变量的拷贝使得程序性能提升。

可以动态分配内存。

这些优点使得很多后台性能要求很高的系统、游戏内核、一些高并发的中间件都是使用C&C++语言开发出来的。比如强大的linux系统、nginx,mysql、redis等等。

曾经看到一个搞笑的评论,hhh

道生一,一生二,二生三,三生万物

电脑生汇编,汇编生C , C生C++,C/C++生万物

指针是什么?

其实指针看起来复杂,听起来复杂,学起来复杂,但是总结下来指针到底是个啥,也就一句话。

指针就是地址,指针变量就是一个存放内存地址的变量

你没看看错,是的就是这么简单明了。通常我们说的指针就约等于说的是指针变量。

指针和内存地址的关系

很多人不明白指针其实也就是不明白内存地址,所以要想明白指针必须先明白指针和内存之间的关系。在讲内存和指针之间的关系之前先说下什么是内存。

先明白一个问题,什么是内存?编程人员常说的内存指的是什么?

? 内存是电脑的一个硬件组成部分。从单片机的组成我们可以看到,CPU、内存和输入输出接口,就组成一个完整的电脑,其他统统属于外设。内存是可以被CPU通过总线进行操作的,也就是与CPU之间有总线相连接的。电脑所有的输入输出,都是要从内存来实现的。内存包括只读内存ROM和读写内存RAM,但在个人电脑(PC)中,我们通常所说的内存,是指读写内存。

? 程序人员常说的内存其实是虚拟内存,程序直接操作的是虚拟内存而不是真正的物理内存。

纳尼

e867c6a7843074863f167cdde986dbc3.png程序都是操作的虚拟内存? 那虚拟内存是个啥东西?

这里先给大家画张C语言程序的内存布局图。关于进程和内存管理会在后面的文章讲出来,记得微信搜索 龙跃十二 点关注。

ab3f60e1c74ed985b285891486bd2460.png

这个图很好的描述了内存地址的布局,指针变量里面存放的地址也就是这个内存地址。顺便说下啥是内存地址,用十六进制表示出来的一串数字编号(就好比你家的门牌号),只是这个数字是给内存标号的。32位系统下这个编号是4byte(32个bit)表示的,64位系统下是8byte(64bit)表示的。(这个小问题面试会被问到的)

如何使用指针?

指针的声明

int *p;

char *p1;

float *p2;

声明还是很简单,指针的类型 * 变量名即可声明一个指针变量。

int num = 5;

int *p = #

此时就是一个int类型的指针变量指向一个int变量,画个图解释下。

a52f2bbe81bbc3e5264c123f03fe55a3.png

以很清楚的看到指针p存放着变量num的地址,我们通常说指针p指向变量num,当p知道变量num之后,p就可以对变量num为非作歹了,比如

int main(){

int num = 5;

int *p = #

printf("*p=%d,num=%d

",*p,num); //此时num的值就变为5

p+=1;

printf("*p=%d

",*p); //此时p指向了哪里?这句代码会不会报错?

}

指针的大小和类型

从上面的声明实例可以看到我定义了三种类型的指针,可以看出指针是有类型的。这里有同学就有疑问了,不是存放内存地址的么,内存地址不就是一串十六进制表示的数字么(其实底层都是二进制),哪来的什么类型一说呢,为什么又需要类型呢?

这个疑问很好,我当时学习的时候也是很疑惑。首先我们明白了指针是一个存放地址的变量,明白这点还不够还必须理解另外一个问题就是

字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit)。地址可以理解为在一片内存中,每个字节(Byte)的编号。

所以很多人肯定会明白了,指针存放的是一个变量的首个字节的地址,那么问题来了。

int a = 5;

int *p = &a;

我们声明指针p指向变量a的地址,也就是说指针p里面存放着变量a的首地址,在32位平台下,int a 是4字节,指针去取a的值的时候找到的是a的首地址,那怎么拿到变量a,聪明的同学已经恍然大悟,是的,没错,所以我们的指针需要类型的,编译器去取指针指向的内容时候会根据指针的类型去取。画个图如下

f702967b37a7431d01edcf4410c557c6.png

此刻我相信你对指针已经有了很高的理解了。指针的大小很好理解 就是存放地址的范围,地址的范围是操作系统地址线的根数决定,所以指针的大小是随操作系统的寻址范围决定的,一般32位系统地址总线也是32根,寻址范围是2^32次方

顺便说下32位操作系统和64位操作系统的区别在哪里,系统的位数代表运算能力,所谓32位就是能计算的字长是32位的,64位系统能计算的字长是64位。处理器的字长越大,说明它的运算能力越强。

点赞

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

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

相关文章

centos安装Python2.7

1. 查看本机系统及python版本 # cat /etc/redhat-release CentOS release 6.7 (Final) 查看CentOS release 6.7 (Final)自带的python版本 # python -VPython 2.6.6 注意, 我们不要破坏系统的Python环境, 因为几个关键的实用应用程序依赖于系统默认的Pyth…

HT68F30控制GPG96244QS1 TFT液晶屏

资料上显示是SPI总线控制、在SPENB由高变底的时候起动传输、由低到高的时候停止转输、并且传送的时候先传高位的数据、现在没有效果出来(正在找问题) 没有效果的意思是: 1、LCD屏没有图像、只有背光在亮 2、还没有找到一个寄存器或者一种方…

type pdf c语言课程设计,c语言课程设计-.pdf

西昌学院C语言课程设计报告题 目_学生成绩管理系统______学生编号_ ___________学生姓名_ _____________班 级指导教师__ _ __ _____2011 年 12 月一. 课程设计任务内容设计一个学生成绩管理系统。系统功能:1)具备对学生基础数据的…

linux —— shell 编程(文本处理)

导读 本文为博文 linux —— shell 编程(整体框架与基础笔记)的第4小点的拓展。(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录基本文本处理流编辑器sedawk模式扫描与处理语言1、基本文本处理sort :用于排序,…

IIC驱动5150遇到麻烦

搞了一天还是没有搞出来、几个问题1、不加镜头、可以检测到应答信号(这个真的是无法解决的大BUG啊)2、反之,加上镜头、检测不到应答信号(自己猜想是不是加上镜头的时候造成电流或者电压变大或者变小了)能不能检测到应答…

ub c语言,操作系统之LRU算法 C语言链表实现

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时…

四种常见的 POST 提交数据方式

四种常见的 POST 提交数据方式 文章目录 application/x-www-form-urlencodedmultipart/form-dataapplication/jsontext/xmlHTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据&#xff0…

成功驱动5150用HT68F30

用了自己写的起动总线和停止总线,终于可以成功 // PROGRAM : 4-17.c 2011.0521 // FUNCTION : I2C Master/Slave Mode Demo Program By Steven // Note : Configuration Option Setting-- // SIM Function Enable //void I2C_START(void); /…

VMware 虚拟机 Ubuntu 系统执行 ifconfig 命令 eth0没有IP地址(intet addr、Bcast、Mask)

可能的原因是,你安装了也安装了其他的虚拟机软件,比如:VirtualBox。我们打开 控制面板 > 网络和共享中心 > 更改适配器设置 , 你就可以打开控制面板/网络和Internet/网络连接界面: 直接禁用相应的网络即可&#…

sublime text3c语言编译运行,c – Sublime text 3 – 编译程序并在终端中运行

我正在使用Ubuntu 12.04,我想知道,是否有可能从终端自动运行c程序?当你不得不在构建控制台中使用它时,它真的很糟糕,因为有时候我会意外地创建无限循环,并且必须重新启动sublime文本再次工作.我正在使用Sublime文本3.解决方法:Sublime Text 3包含两个您可能感兴趣的…

5150晶振不起振

1、这是一个比较让我费解的问题、今天从相机输入了PAL信号、发现根本没有解码出来,然后检查检查,发现晶振不起振 解决中。。。 1、换一个板子,看是不是这个板子出了问题、 2、换一个起振电容 问题解决了、原因是TVP5150的PDN脚应该输入高电…

c语言us16 t,使用C ++将越南语字符编码为USASCII,ISO88591,UTF8,UTF16BE,UTF16LE,UTF16(示例代码)...

我已经编辑了我的帖子。当前,我正在尝试对用户的输入字符串进行编码,然后将其转换为每种编码格式。我可以使用Unicode完美地做到这一点,而且我认为输入String的格式为UTF-8。如果我的inputString是“ Hello”。但是,当我尝试输入“…

linux一些基础知识

linux面试题及答案 一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 。 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统。 3. Linux文件系统中每个文件用 i节点来标识。 4. 全部磁盘块由四个部分组成&#xff…

这本轻小说真厉害 2016

傲娇御坂美琴成轻小说女王一姐 轻小说排名公布 到了年底,作为轻小说的粉丝就没有理由不关注“这本轻小说真厉害!”的相关评选吧?腾讯动漫此前曾经报道过《OVERLORD》以及《龙王的工作》获得榜首殊荣的消息。而近日,年度的最佳作品、最佳角色以及最佳插画师等奖项也已经公布,快…

IDEA初次使用Tomcat运行项目(如何添加加载项目到Tomcat)

IDEA中Tomcat设置说明 Tomcat最好使用干净的版本 不同的版本适配不同的JDK 设置Tomcat基本信息 加载项目(war和war exploed模式简单说明) 配置完项目后警告消失 应用后启动 选择相应的模式即可

回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)

问题:0/1背包问题例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量。背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1]/weight[i-1].const int weight[Max]{1,11,21,23,33,43,45,55};const…

ISE应用入门的一些问题

1、怎样添加IP 2、怎样用modelsim调用IP生成的仿真文件。 今天用modelsim仿真ISE生成的DDR IP IP核的地址:E:\FPGA\MIS607\Mis607B\update\CH09_DDR_TEST\MiS607B_DDR3_Test\DDR3_Test\ipcore_dir\mig_ddr3_control\example_design\sim\functional 所以要把modelsim…

linux模块加载和模块卸载时出现的问题

在编写驱动程序的时候有时候会出现这种情况,模块加载之后不能卸载或卸载之后不能在加载,cat /proc/devices 后发现设备还占用着设备号,这种情况下,再次加载驱动模块肯定不会成功,必须重新启动才可以解决。最近仔细看书…

IDEA中中文乱码问题解决方案

1.修改idea安装目录下的两个文件 C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea.exe.vmoptions C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea64.exe.vmoptions 在这两个文件下增加一行: -Dfile.encodingUTF-8 2.做此修改后,tomcat运行日志会…