秒解指針變量:抵消法

一、本篇blog目的

本篇的目的是爲了說明下面代碼中的一個等價關係:

int a=200;

int *p;

p=&a; // *p是和a等價的

二、左值和右值

int a=999;

int b;

b=a;

(1)a、b都是變量

(2)b=a;是賦值語句;賦值號左邊稱爲左值,表示內存 b;右邊稱爲右值,表示內存 a中的數據。

三、指針有關的兩個重要運算符:& 和 *

學習指針,有兩個關鍵的運算符:& 和 *。

& 和 * 的含義
表達式 解釋
&a a是變量,代表一塊內存;&a 表示 a 的內存的地址
*p

p是指針變量或者地址值

*p  作爲左值表示p指向的內存

*p  作爲右值表示p所指內存中的值

int a=999;

printf("%d %d",a,*&a);// 999   999

*&放在一起,抵消掉了

(1)&a 表示取變量的地址

(2)*(&a),當其處於賦值號左端,表示一塊內存;檔期處於賦值號右邊,表示這塊內存中的值

#include <stdio.h>
int main(void)
{    
    int a;
    a=100;
    
    printf("%d\n",a);// 100
    *&a=200;
    printf("%d\n",a);// 200

}

四、應用

#include <stdio.h>
int main(void)
{    
    int a,b;
    a=100;
    b=200;
    int *p,*q;
    p=&a;
    q=&b;
    
    *p=*q;

}

最難的一句就是

*p=*q;

利用代入法:

因爲:p=&a; q=&b;

所以:*p=*q;

等價於:*&a=*&b;

利用抵消原理:

等價於:a=b;

這樣,把複雜的指針變量轉化爲普通變量。等大家熟悉了,根本就不需要代換了,看到*p;就會條件反射的得出:“*p等價於a” 的結論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章