1.内存中每个位置都由一个独一无二的地址标识。
2.内存中每个位置都包含一个值(内容)。
对于变量也是如此.
地址内容:
100 104 108 112 116
| ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄| ̄ ̄ ̄|
| 3 | -1 | 10769582 | 160 | 6 |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
图1
可以根据存储地址(100,104,108 。。。)找到其所处的内存位置,并提取它的内容(3,-1,10769582。。。)。即根据一个地址可提取其中的内容(值)。
但让人去记忆一个存储地址是不实际的,因此为了简化,高级语言提供了名字,代替地址来访问内存的位置。于是,下图出现了。
a b c d e
| ̄ ̄ ̄| ̄ ̄ ̄| ̄ ̄ ̄ ̄ ̄| ̄ ̄ ̄ ̄| ̄ ̄ ̄|
| 3 | -1 | 10769582 | 160 | 6 |
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
图2
这些名字即是通常我们说的变量。(当然,图2的这些关联由编译器实现,而硬件依然通过地址访问内存位置)。
说到此,我们知道了,所有的变量都有2个重要属性:
1. 地址 (这就是在c语言中,‘&变量’(’&a’)可以得到变量地址的根本原因。)
2. 内容 (即值图中3,-1,10769582。。。)。
得到变量的地址我们用
int a;
&a时得到a的地址。
引用变量时,如
int a,b;
a=3;
即通过变量名得到或改变变量的内容。
而这里所说的变量包括: 普通变量、指针变量。
指针变量:
指针变量是包含 一个变量地址 的变量。
除此外,符合变量的特点。
定义时为了和定义普通变量区别开来,在指针变量名前加了* (此处的*号仅仅是一个指针变量的标记而已,表明这是一个指针变量,别无他意。不作‘*’运算解释。)
定义时:
int *a; //定义时,*号是一个指针变量的标记而已,不作‘*’运算解释
或
int b;
int *a=&b; //定义时,*号是一个指针变量的标记而已,不作‘*’运算解释
注意:定义后的指针变量名是a,而不是*a。
*只是一个标记,为了区别普通的变量定义而设。
因此,指针变量和普通变量区别仅仅在于它们存储内容。
指针变量是一个变量地址。
除了在定义时,指针变量和普通变量有些不同(指针变量前加个*号),在其他使用中和普通变量的表意相同。如:
int a;
那么&a 表意是取a变量本身的地址;
a=3; 让a的值(内容)变成‘3’ ;
int *b;
那么&b表意是取指针变量b本身的地址;
b= &a ; 让指针变量b的值(内容)变成‘a的地址’ ;
单目操作符* (*运算):
*取出或改变其后地址中存储的内容(值)。
int a=3;
int *p=&a; //定义时,*号是一个指针变量的标记而已,不作‘*’运算解释
*p=6;
第三行语句 p的内容值为a的地址, *p ? *(p) ? *(&a) ? a
注:*运算时,可作如下的形式变换,更清晰明了:
*指针变量名 ? *(指针变量名)
[] 变址运算符:
为避免混乱,将所有的[]运算,转换为*运算,有如下关系:
a[i] ? *(a+i) //等量代换