在刚开始接触的时候,我完全不怎么懂这两个运算符如何去用它,什么时候用,什么时候不用,我就只知道它的一些具体概念,并不懂如何去运用这两个运算符,经过几天的学习后,才懂的怎么去用这两个运算符。
(1)& 运算符 :用于取一个对象的地址
(2)* 运算符:作用于指针时表示访问指针所指向的对象
如下图:
它运行结果为:
a20
&a0093F968
b0093F968
*b20
这个时候,看结果我们就会发现为什么&a与b为啥不一样的。
原因:
变量a 本质上代表一个存储单元。
处理器通过该存储单元的地址来进行访问到该存储单元中的数据。
因此a本来代表两个值:存储单元的地址和储单元中的数据。
C语言中a表示存储单元中的数据,&a表示存储单元的地址。
如下图:我们可以发现a本身值是20,但是a在内存中的地址值为0093F968,也就是&a,我们将&a赋给b,这时候我们就只是将地址值赋给b并没有将值赋给b,这时候存储单元的地址值拿到了,我们再通过存储单元的地址值来查找相关的存储单元中的数据。(要求对应的存储单元中存储的是另一个存储单元的地址)
那我们这时候该如何去理解a、&a、a:
1.理解它们的根本的含义
a:表示对应的存储单元中的数据。
&a:表示对应的存储单元的地址。
a:表示要求a对应的存储单元中的数据一定是另一个存储单元的地址。
这样,a才能表示另一个存储单元中的数据。
2.根据声明的数据类型来判断a存储的是存储单元的数据值,还是地址值
当我们声明a的类型为int数据类型时,a存储的则是一个整数数值,通过a可以访问(读取或修改)这个数值。
当我们声明a的类型为int 数据类型时,a存储的是一个存储单元的地址,而该存储单元中的数据是一个整数数值;通过a我们可以访问(读取或修改)这个数值。
当我们声明a的类型是int数据类型时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过a我们可以访问(读取或修改)这个数值。
需要注意的是,我们的指针只能指向某种特定类型的对象,也就是说,每个指针都必须指向某种特定的数据类型,除了void类型的指针。
“” 有三个作用:
1.乘法
2.定义指针变量
3.取得指针所指向的内存中存储单元的数据值,当指针指向另一个内存中存储单元的地址时,那就是另一个的内存中存储单元的数据值。
C语言中取值符(*)与取地址符(&)的区别:
(1)两者根本意义不同。是指针的意思,而&是取地址的意思,这两个相辅相成。
(2)语言规则不同,变量类型加就是一个指向该变量类型的指针,通俗点说,指针就是可以通过地址修改和获取该变量的值,而&符号只是获取该变量的地址!
(3)取地址符&,对任意变量都可以进行取地址操作;*是取指针目标运算符,其后跟随的必须是指针类变量。
注意的是:&后只能跟变量,不能跟常量,因为常量是一个立即数,它不是个容器,所以没有地址。
如下图:
“&”和“ * ”这两个运算符优先级别是相同,按从右向左的方向结合。因此“&a”先进行“ * ”运算,变量a再进行“&”运算,“&a”取变量a存储单元中的地址。“&a”先进行“&”运算,“&a”就是取变量a的地址,然后执行运算,“&a”就是取变量a存储单元中所在地址的值,实际就是变量a。
综上,&是取变量或指针自身的地址;*是取指针中指向地址内的数据;什么都不加,就是取该变量或指针中当前存储的数据。