一、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,如下图。
好,到这里,相信小伙伴们,对于什么是指针,指针的定义,指针的赋值,指针的地址和指针所指向的地址,有了很透彻的了解。
什么?还不明白??建议关注本公众号,继续一起学习,也可以私信交流。
后续作者会陆续以通俗易懂的方式讲解指针的操作、指针的指针、结构体指针、数组指针、指针数组、函数指针、指针函数...形成一个系列以及嵌入式各种技术、经验等知识。
关注公众号,并加星标,不要错过精彩内容。觉得文章不错,请点赞、转发行动支持作者继续创作,谢谢。
声明:
本号原创、转载的文章、图片等版权归原作者所有,如有侵权,请联系删除。