C语言指针这么理解,真透彻!小学生也说so easy!

本文为作者原创文章,原创不易,如需转载请附上本号链接或者联系作者。谢谢!

图片

一、C语言基础变量的定义

首先,C语言变量定义的基本形式:  <变量类型> <变量名称>

变量类型,就是确定了变量名称对应的实体是什么?比如,

int a;   //变量a是一个整型数char b;   //变量b是一个字符

现实生活也有<变量类型> <变量名称>这样的形式,比如,有一个名称angle,那angle是什么?一个人?一个物品?加上对angle的类型描述后,那就确定了angle的对象属性。

女人 angle;   //angle是一个女人物品 angle;   // angle是一个物品

画个表格,帮助理解

<变量类型> 

<变量名称>

说明

int

a

a是一个整型数

char

b

b是一个字符

<变量类型> 

<变量名称>

说明

女人

angle

angle是一个女人

物品

angle

angle是一个物品

二、C语言指针的定义

理解了C语言基础变量定义的概念后,我们再来对应理解C语言指针的定义,指针也是一种变量,也符合变量定义的基本形式:

<变量类型><变量名称>  

int  *p;

很多人对指针不理解或者理解不透彻,有两个方面的原因:

1.被指针这个翻译/叫法带偏了。

2.定义指针变量时,被这个*习惯性地用法/写法带偏了

咱们一个一个来解释、纠正和重新理解,

1.指针是一种变量,它的变量类型(变量实体)是一个地址,咱们把“指针”改成“地址变量”,以后碰到指针,就叫做“地址变量”,也就是说这个变量的实体内容是一个地址

2.定义一个指针变量,习惯性写法是把*靠近变量名,按照C语言变量定义的基本形式<变量类型> <变量名称>,很容易产生错误的理解。那么咱们换一个写法,把*往前写,远离变量名,来看看效果。

以一个整型指针变量的定义为例,画个表格对比两种写法,帮助理解。

<变量类型> 

<变量名称>

说明

习惯写法

int

*P

容易误认为 *p是变量名称

改进写法

int *

p

更容易理解 p是变量名称

以上表格可以清晰的看出,*在变量定义时,是一种变量类型,表明变量是一个指针类型的变量,也就前面说的地址变量。但是,*在变量定义时,需要和其他基础变量类型一起使用,组成意义更具体的变量类型,比如,int 和*一起使用,

int *p;

同样,以表格的形式来帮助理解。

<变量类型> 

<变量名称>

说明

int *

p

1. 整型指针,指向整型的指针

2. 整型地址变量,整型的地址变量

char *

p

1. 字符型指针,指向字符的指针

2. 字符型地址变量,字符的地址变量

<变量类型> 

<变量名称>

说明

女人*

angle

1. 女人指针,指向女人的指针

2. 女人地址变量,女人的地址变量

物品*

angle

1. 物品指针,指向物品的指针

2. 物品地址变量,物品的地址变量

三、C语言指针的用途

现在理解了指针的定义以及指针就是一个地址变量,那么指针或者叫做地址变量在C语言里面具体代表什么?有什么用途呢?

在计算机的世界里,万事万物皆信息,信息都需要存储空间,存储空间都有地址。

类似现实生活中每个人都有居住空间和居住空间的地址,xx省xx市xx区xx街道xx小区xx楼xx单元xx号。

计算机世界的地址没那么复杂,就是一个简单整形数,比如,0x0000 0004,0x8000 0000等等,地址是多少字节是编译器根据计算机体系结构确定的,这个内容后续章节再讲解。

下面我们以实际的程序来讲解,

int a ;int b ;int *p;

a、b、p都是变量,编译链接后或者运行时,就会分配一个存储空间,具体会分配到哪个地址是由编译链接时和运行时确定,暂且先不管,比如分配如下:

图片

这个时候变量 a、b、p都被分配了自己的存储空间和对应的空间地址,但是,存储空间没有指定存储什么内容,一般默认0或者是随机值,这个后续再深入讲解。现在可以理解成什么都没有存,是空的。

现在对a、b、p空间写内容,在C语言中称之为赋值。

a = 10;b = 20;

图片

很简单,对不对,赋值后就成为上图所示。但这个时候p还是一个空的,我们称之为空指针。

接下来,有小伙伴按耐不住了,给p指针也赋值呗,通过前面的介绍,p指针也称之为地址变量,它的内容应该是一个地址,那么,我们把a变量的地址,赋值给p指针,有小伙伴可能这么写了,

*p = 0x2000;

一运行程序,就崩溃了,为啥?为啥!说明之前对于指针定义的理解,还是错误的。那我们把之前对指针的定义,再般过来,认认真真看一遍。

<变量类型> 

<变量名称>

说明

int *

p

1. 整型指针,指向整型的指针

2. 整型地址变量,整型的地址变量

char *

p

1. 字符型指针,指向字符的指针

2. 字符型地址变量,字符的地址变量

p才是真正意义的指针变量,* 在指针定义的时候,是指针变量的类型。类似,我们不能已经定义了变量a后,给a赋值时,再带上变量类型,就是错误的了。

int a = 10;   // 错误的写法。

同理,指针变量的赋值,也不能带上*变量类型,

p = 0x2000;   // 这样就对了。

可能有很多小伙伴,就不服气了,经常在代码里面见到,指针变量*p = 0x2000;的这种写法啊,这个咱们后续文章讲解指针操作的时候在详细讲解。

按照上面的步骤给指针变量赋值后,指针的地址是0x1000,指针的内容是0x2000,地址变量p的地址是0x1000,地址变量的值是0x2000,这样指针p就指向了变量a,如下图。

图片

好,到这里,相信小伙伴们,对于什么是指针,指针的定义,指针的赋值,指针的地址和指针所指向的地址,有了很透彻的了解。

什么?还不明白??建议关注本公众号,继续一起学习,也可以私信交流。

后续作者会陆续以通俗易懂的方式讲解指针的操作、指针的指针、结构体指针、数组指针、指针数组、函数指针、指针函数...形成一个系列以及嵌入式各种技术、经验等知识。

关注公众号,并加星标,不要错过精彩内容。觉得文章不错,请点赞、转发行动支持作者继续创作,谢谢。


声明:

本号原创、转载的文章、图片等版权归原作者所有,如有侵权,请联系删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值