一、本篇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” 的結論。