指針之 *((volatile unsigned long *)(x))解析

  今天從新溫習了一下C語言的指針部分,忽然想到了常常會遇見的一種宏定義:#define PGAS (*((volatile unsinged long *)(x)))spa

  在解析該宏定義前,先看看指針變量的聲明指針

      聲明一個int類型的指針變量:int* p;code

      僅僅是這樣定義,這個指針是不可以直接拿來使用的,還必須給它賦值(初始化),例如:blog

  int a = 10;內存

  int* p = &a;數學

  或:io

  int a = 10;class

  int* p;變量

  p = &a;im

  其中,&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");
}

     記得剛接觸到這種宏定義時,查查資料當時能夠弄懂,但是等到下次再碰見時,又不明白了,總之是時而明白,時而糊塗。

以文字的形式記錄下來,能夠幫本身整理整理思路加深理解和記憶。

相關文章
相關標籤/搜索