zoukankan      html  css  js  c++  java
  • 指针之 *((volatile unsigned long *)(x))解析

      今天重新温习了一下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 ”,*p);

       运行下面的代码,可以很清楚的了解指针变量的地址和指针变量所指的地址的关系:

    void main()
    {
        int a = 10;
        int* p = &a;
    
        printf("变量 a 的值:%x
    ",a);
        printf("变量 a 的地址:%x
    ",&a);
        printf("指针变量 p 的值:%x
    ",p);
        printf("指针变量 p 的地址:%x
    ",&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
    ",*((unsigned int*)(0x23febc)));
        printf("%d
    ",A);
            
        system("pause");
    }

         记得刚接触到这种宏定义时,查查资料当时可以弄懂,可是等到下次再遇见时,又不明白了,总之是时而明白,时而糊涂。

    以文字的形式记录下来,可以帮自己整理整理思路加深理解和记忆。

  • 相关阅读:
    centos下如何关闭xdebug扩展
    xdebug调试的原理
    取值再拼接跳转链接
    描点返回-动画
    比较旧的写法:验证车牌、手机号、电话、qq等
    jQuery实现ie浏览器兼容placeholder效果
    CSS3的REM设置字体大小
    整理前端问题
    css3 hover效果
    ie7 a标签强制不换行兼容问题
  • 原文地址:https://www.cnblogs.com/Waming-zhen/p/4353963.html
Copyright © 2011-2022 走看看