一、本篇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” 的结论。