C语言中变量地址的赋值

2018-09-26 14:47:28 来源:21ic
标签:

 

C 语言中,变量的地址往往都是编译系统自动分配的,对我们用户来说,我们是不知道某个变量的具体地址的。所以我们定义一个指针变量 p,把普通变量 a 的地址直接送给指针变量 p 就是 p = &a;这样的写法。

 

对于指针变量 p 的定义和初始化,一般有两种方式,这两种方式,初学者很容易混淆,因此这个地方没别的方法,就是死记硬背,记住即可。

 

方法 1:定义时直接进行初始化赋值。

unsigned char a;

unsigned char *p = &a;

 

方法 2:定义后再进行赋值。

unsigned char a;

unsigned char *p;

p = &a;

 

大家仔细看会看出来这两种写法的区别,它们都是正确的。我们在定义的指针变量前边加了个*,这个*p 就代表了这个 p 是个指针变量,不是个普通的变量,它是专门用来存放变量地址的。此外,我们定义*p 的时候,用了 unsigned char 来定义,这里表示的是这个指针指向的变量类型是 unsigned char 型的。

 

指针变量似乎比较好理解,大家也能很容易就听明白。但是为什么很多人弄不明白指针呢?因为在 C 语言中,有一些运算和定义,他们是有区别的,很多同学就是没弄明白它们的区别,指针就始终学不好。这里我要重点强调两个区别,只要把这两个区别弄明白了,起码指针变量这部分就不是问题了。这两个重点现在大家死记硬背,直接记住即可,靠理解有可能混淆概念。

 

第一个重要区别:指针变量 p 和普通变量 a 的区别。

 

我们定义一个变量 a,同时也可以给变量 a 赋值 a = 1,也可以赋值 a = 2。

 

我们定义一个指针变量 p,另外还定义了一个普通变量 a=1,普通变量 b=2,那么这个指针变量可以指向 a 的地址,也可以指向 b 的地址,可以写成 p = &a,也可以写成 p = &b,但就是不能写成 p = 1 或者 p = 2 或者 p = a,这三种表达方式都是错的。

 

因此这个地方,不要看到定义*p 的时候前边有个 unsigned char 型,就错误的赋值 p=1,这个只是说明 p 指向的变量是这个 unsigned char 类型的,而 p 本身,是指针变量,不可以给它赋值普通的值或者变量,后边我们会直接把指针变量称之为指针,大家要注意一下这个小细节。

 

前边这个区别似乎比较好理解,还有第二个重要区别,一定要记清楚。

 

第二个重要区别:定义指针变量*p 和取值运算*p 的区别。

 

“*”这个符号,在我们的 C 语言有三个用法,第一个用法很简单,乘法操作就是用这个符号,这里就不讲了。

 

第二个用法,是定义指针变量的时候用的,比如 unsigned char *p,这个地方使用“*”代表的意思是 p 是一个指针变量,而非普通的变量。

 

还有第三种用法,就是取值运算,和定义指针变量是完全两码事,比如:

unsigned char a = 1;

unsigned char b = 2;

unsigned char *p;

p = &a;

b = *p;

 

这样两步运算完了之后,b 的值就成了 1 了。在这段代码中,&a 表示取 a 这个变量的地址,把这个地址送给 p 之后,再用*p 运算表示的是取指针变量 p 指向的地址的变量的值,又把这个值送给了 b,最终的结果相当于 b=a。同样是*p,放在定义的位置就是定义指针变量,放在执行代码中就是取值运算。

 

这两个重要区别,大家可以反复阅读三四遍,把这两个重要区别弄明白,指针的大门就顺利的踏进去一只脚了。至于详细的用法,我们后边用得多了就会慢慢熟悉起来了。

 
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
 

 

继续阅读
工程师:我与C语言长别离了,因为...

这几天来,我在思考那些正在挑战 C 语言的系统编程语言领袖地位的新潮语言,尤其是 Go 和 Rust。思考的过程中,我意识到了一个让我震惊的事实 —— 我有着 35 年的 C 语言经验。

串联电池电压及温度测量方法研究

一、引言   在提倡节能减排的时代背景下,新能源的研究正成为公众关注的焦点,以电为动力的电动车就是研究的热点之一。电池是电动车的能量之源,为确保电池组性能良好并延长其使用寿命,需要

更多资讯
简单几步让你看懂单片机时序图

操作时序永远是使用任何一片IC芯片的最主要的内容,看懂时序图,再操控这个芯片就非常容易了。而提取芯片器件手册上有用的信息是使用芯片的最基本步骤。

如何实现SoC全生命周期的监测?

SoC的设计越来越复杂,上市时间、软硬件集成、系统级验证、系统性能、异构、网络安全/功能安全等都是设计人员需要考虑的因素。流片前,设计师能通过仿真软件进行验证,但是流片过程中很多意想不到的结果,需要在流片后仍能被准确的检测出来。

如何将单片机的波特率作为形参的函数

不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。

代码分享教你如何使用msp430单片机延时函数

今天看示例程序中出现了__delay_cycles()这个函数,在查找msp430x54x.h这个头文件的时候,发现这个头文件中没有该函数的声明,原来这个函数已经在IAR这个编译器中集成,这里总结一下__delay_cycles();这个函数的具体用法

如何控制51单片机液晶实现计时器的功能?

要想实现人机交互,显示装置是不可缺少的。前面讲到了如何利用单片机控制数码管的显示,这篇文章主要关于如何控制液晶显示,并在此基础上加上定时器的功能,把原来已用数码管显示的定时器搬到液晶屏上来。

Moore8直播课堂