您的位置:首页 > 其它

指针知识总结

2017-08-13 22:18 204 查看
定义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时会出现段错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: