指针知识总结

定义int *a = 1;
a:取指针a的值(即地址)
   *a:取指针a指向的内容
  &a:取存放指针a的值的地址

一、基本概念及区别
1、变量a 本质上代表一个存储单元。CPU通过该存储单元的地址访问该存储单元中的数据。所以a本来代表两个值:存储单元的地址和储单元中的数据。于是就有了二异性。为了消除这种二义性,C语言规定a表示存储单元中的数据,&a表示存储单元的地址。

2、a存储单元中的数据可以是一个普通数值,也可以是另一个存储单元的地址,比如:a = &b; 语句就是将b的存储单元的地址存入a存储单元中。C语言规定*a代表a中存储的地址对应的存储单元中的数据,也就是访问*a就等于访问b,于是*a提供了通过a访问b中的数据的手段。

3、a表示a对应的存储单元中的数据。&a表示a对应的存储单元的地址。*a表示:首先,要求a对应的存储单元中的数据一定是另一个存储单元的地址。于是,*a表示另一个存储单元中的数据。
当a声明的类型是int时,a中存储的是一个整数数值,通过a可以访问(读取或修改)这个数值。
当a声明的类型是int*时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是一个整数数值;通过*a可以访问(读取、修改)该数值。a == &*a 都是该存储单元的地址。
当a声明的类型是int**时,a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外这个存储单元中存储的是一个整数数值;通过**a可以访问(读取或修改)这个数值。

二、应用
在rk3399芯片中,已知CRU的寄存器地址为0xff760000,当我们定义volatile unsigned long *cru = NULL;cru = (volatile unsigned long *)ioremap(0xff760000, 0xffe)后,此时,cru为0xff760000的内存地址在ioremap映射后的一个虚拟地址,由于cru对应的内存地址0xff760000存储的默认数据为0x000001b8,所以*cru的值为0x000001b8,&cru为自身的存储地址。
如果这里重新定义:volatile unsigned long *cru = NULL;cru = 2。此时cru的值为2,&cru为其存储地址,但因为2为不合法地址,其并没有对应的存储数据,所以打印*cru时会出现段错误。

posted on 2017-07-24 15:39  echo5  阅读(141)  评论(0编辑  收藏  举报