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,一经查实,立即删除!

相关文章

HT68F30控制GPG96244QS1 TFT液晶屏

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

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

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

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

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

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

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

这本轻小说真厉害 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…

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运行日志会…

linux 6.2 期末考试题,redhat6.2-linux考试试卷(带部分答案)

这个是初学redhat6.2的考试内容,带答案(实做的,水平有限,不完整答案)--------------------------------------------------------------------------------------------装 订 线-----------------------------------------------------------------------------------------广东…

video4linux 安装,【精品博文】Video4linux 下视频编程的流程

最近一直在忙基金申报,今天终于顺利提交了,剩下的就看缘分啦。今天有时间写写Video4linux 下视频编程的流程。Video4linux(简称 V4L),是linux 中关于视频设备的内核驱动。现在已有Video4linux2,还未加入linux 内核,使用的时候要自…

intellij IDEA--- 报inspects a maven model for resolution problems

解决方法是&#xff1a; 第一种&#xff1a; 找到pom.xml 右击 --> Maven --> reImport 第二种方法&#xff1a; 第三种 <properties><junit.version>4.11</junit.version><spring.version>4.3.14.RELEASE</spring.version></prop…

spring AOP自定义注解方式实现日志管理

转&#xff1a;spring AOP自定义注解方式实现日志管理 今天继续实现AOP&#xff0c;到这里我个人认为是最灵活&#xff0c;可扩展的方式了&#xff0c;就拿日志管理来说&#xff0c;用Spring AOP 自定义注解形式实现日志管理。废话不多说&#xff0c;直接开始&#xff01;&…

GPG96244QS1屏驱动难题

void Gpg_Master(unsigned int Data) {unsigned int temp 0b1000000000000000;Master_SCK1;ENABLE_244QS1();//初始化前使能片选_delay(10);DISABLE_244QS1();Master_SCK0; //Generate SCK Clockdo{Master_SDI Data &temp;Master_SCK1; _delay(10); Master_SCK0; //Gener…

linux装机量,在没有盗版的世界 Linux桌面的装机量可能占比达到40%

近日&#xff0c;由奥斯陆大学经济学系博士生Arne Rogde Gramstad公布的“Software Piracy and Linux Adoption”研究报告&#xff0c;发现了Linux系统装机量和软件盗版之间的潜在关联。在这份报告中引用了商业软件联盟(BSA)自2012年以来从104 个国家收集的盗版软件信息&#x…

Spring.io本地服务器解决超时问题

建本地服务器的方法&#xff0c;详情参考官方说明&#xff1a;https://github.com/spring-io/initializr 打开一看是英文&#xff0c;而且你鼓捣半天不一定成功&#xff0c;没事&#xff0c;我已经搭建好了可执行jar包给你下载使用&#xff01;你只需要java -jar&#xff0c;如…

lgg6 android 9,LG G6的18:9屏幕用起来到底是什么样

前不久LG公布了全新18:9屏幕&#xff0c;据他们称这块屏幕是特意为智能手机而设计&#xff0c;如今传言也指向LG G6将会成为首款使用这块屏幕的旗舰&#xff0c;那么为何LG会放弃智能手机坚持的16:9转而使用18&#xff1a;9&#xff0c;体验又会是什么样呢&#xff1f;最近LG公…

屏上有一层紫色(正在找原因)

注&#xff1a; 1、这两天一直在找这个原因、5150控制成功、屏驱动成功、可是为什么屏上面有一层紫色的覆盖住了呢、非常的让我感到不解2、如果什么也不输入、解码出来的信号在TFT上显示是紫色、我现在是不怎么清楚是屏的原因还是解码的原因

Cadence PCB SI

Cadence PCB信号完整性 (SI) 和电源完整性技术(PI)提供了可调整、高性价比并且支持前仿真和后仿真的系统互联设计和分析环境。 Cadence PCB信号完整性 (SI) 和电源完整性技术(PI)提供了可调整、高性价比并且支持前仿真和后仿真的系统互联设计和分析环境。Cadence PCB SI和PI产品…