• 指针之 *((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");
    }

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

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

  • 相关阅读:
    P1194 买礼物(建模)
    024 Android 对话框(AlertDialog)的应用(与Android黑马培训班的024相对照学习)
    023 Android 滚动视图(ScollView)
    022 Android 开源项目使用指南
    021 Android 日历视图(Calendarview)
    020 ProgressBar(进度条)、SeekBar(拖动条)与星级评分条(RatingBar)
    019 Android 程序调试技巧汇总
    018 Android 单选按钮(RadioButton)和复选框(CheckBox)的使用
    017 Android ToggleButton(开关函数)与switch (开关按钮)
    016 Android Toast语句应用
  • 原文地址:https://www.cnblogs.com/Waming-zhen/p/4353963.html
Copyright © 2020-2023  润新知