指针之 *((volatile unsigned long *)(x))解析
来源:互联网 发布:软件质量保证书范本 编辑:程序博客网 时间:2024/06/05 02:17
今天重新温习了一下C语言的指针部分,突然想到了经常会碰见的一种宏定义:#define PGAS (*((volatile unsinged long *)(x)))
在解析该宏定义前,先看看指针变量的声明
声明一个int类型的指针变量:int* p;
仅仅是这样定义,这个指针是不能够直接拿来使用的,还必须给它赋值(初始化),例如:
int a = 10;
int* p = &a;
或:
int a = 10;
int* p;
p = &a;
其中,&a表示变量a所代表的内存地址,所以指针变量p存储的是一个内存地址(这个地址要和指针变量p自身的地址区分开),而*p是指针变量p所指内存地址中存储的数据(上述代码中既是变量a的值),经过初始化的指针我们是可以拿来使用的。
例如:给这个指针所指内存地址赋值:*p = 15;
读取这个指针所指地址中存储的数据的值 printf(“d\n”,*p);
运行下面的代码,可以很清楚的了解指针变量的地址和指针变量所指的地址的关系:
void main(){ int a = 10; int* p = &a; printf("变量 a 的值:%x\n",a); printf("变量 a 的地址:%x\n",&a); printf("指针变量 p 的值:%x\n",p); printf("指针变量 p 的地址:%x\n",&p); system("pause");}
运行结果:
从图中可以看出变量a的地址和指针变量p的值是一样的:0x23febc
回归正题:#define PGAS (*((volatile unsinged long *)(x)))
其中,x 是一个常量,代表内存地址值,(volatile unsinged long *)(x) 是把这个常量x强制转换为一个unsigned int 指针,(*((volatile unsinged long *)(x)))表示的是地址x中的数据。
在上面的代码中我们可以进行类似数学公式的带入替换:
int a = 10;
int* p;
p = &a;
一般我们要对指针变量p所指地址赋值或要读取指针变量p所指地址中的数据时,是这样操作的:
int b = *p;
*p = 20;
等价于:
int b = *(&a);
*(&a) = 20;
上面说了&a表示的是变量a的地址,也就是一个无符号整型(unsigned int)常量。
再看一段代码:
#include <stdio.h>#define A (*((volatile unsigned int*)(0x23febc)))void main(){ A = 20; printf("%d\n",*((unsigned int*)(0x23febc))); printf("%d\n",A); system("pause");}
记得刚接触到这种宏定义时,查查资料当时可以弄懂,可是等到下次再遇见时,又不明白了,总之是时而明白,时而糊涂。
以文字的形式记录下来,可以帮自己整理整理思路加深理解和记忆。
volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
- 指针之 *((volatile unsigned long *)(x))解析
- 指针之 *((volatile unsigned long *)(x))解析
- (*(volatile unsigned long *)
- ( *(volatile unsigned long * ) )
- (*(volatile unsigned long *)
- (*(volatile unsigned long *)详解
- (*(volatile unsigned long *)详解
- (*(volatile unsigned long *)心得体会
- *(volatile unsigned long *) 语法
- (*(volatile unsigned long *) 地址)
- (*(volatile unsigned long *)
- *(volatile unsigned long *) 语法
- (*(volatile unsigned long *)详解
- (*(volatile unsigned long *) 关于MCU头文件的解析
- (*(volatile unsigned long *) 关于MCU头文件的解析
- (*(volatile unsigned long *)该怎样理解?
- (*(volatile unsigned long *) 详细解释
- (*(volatile unsigned long *)) 的理解
- eclipse get set 大小写
- Unreal Engine 4 遍历文件夹读文件
- 深入分析安卓软件安装原理
- CodeForces 560A Currency System in Geraldion
- C语言编程入门——综合练习(二)
- 指针之 *((volatile unsigned long *)(x))解析
- poj-2553 Frogger
- 2015 多校联赛 ——HDU5344(水)
- uva 101
- Android开发--Intent-filter属性详解
- 第一天 ted英语学习Chris Milk: How virtual reality can create the ultimate empathy machine
- Java中的多线程
- Direct-X学习笔记--天空盒
- HDU5137