图 2 指针变量和它指向的变量
2.3 与指针相关的运算符:&和*
(1) &和*在 C 语言中是两个运算符。&运算符的作用是计算出它作用其上的变量
的地址。如对于图 2 中的情况,表达式&a 的值是 2A6B。表达式&p 的值是 304A。
(2) 有了&运算符,就可以给指针变量赋值。如 int* p; p=&a; 此时 p 的值是 2A6B。
(3) *运算符的作用是计算出它作用其上的指针变量所指向的变量的值。
int a=10;
int* p=&a;
printf("%d", *p); //输出 a的值 10
语句 printf(“%d”, *a);输出什么?此语句输出的值不可预知。原因是将整型变量 a 当作整
指针型看待,由于 a 的值是 10,所以输出地址 10 处 4 个字节二进制数所代表的十进制数,
但地址 10 开始的 4 个字节到底存储的是什么,我们不知道。
(4) &和*运算符的关系
让我们考虑一下,&*p 的含义是什么呢?以 3 中的程序为例分析如下:*p 得到的是 p
指向的变量的值 10,当然就是 a;&*p 等价于&a,而&a 就是 p。
那么*&a 的含义又是什么呢?分析如下:&a 得到的是 a 的地址,当然就是 p。*&a 等
价于*p,而*p 就是 a。
综上,&和*是互逆运算。当一个变量(不论是普通变量还是指针变量),被&*或*&同
时作用时,等价于没作用。即&*=*&=I(单位矩阵——恒等变换)。
3.同类集合变量——数组的指针和指针变量
指针就是起始地址。数组的指针就是数组的起始地址。
3.1 一维数组的指针和操作一维数组的指针变量——本质上是指向单个变量的指针变量
令 ANY 代表任何一种已经定义的类型。m 是已经定义的一个常量。一维变量数组的定
义形式是 ANY one_dem[m]; one_dem 是数组名,它本身不是变量,它是 m 个 ANY 型变量
的统称。这 m 个 ANY 型的变量(即数组的元素)one_dem[0],one_dem[1],…… one_dem[m-1],
每一个都相当于 ANY 型的一个简单变量。它们在内存中是连续存放的,如果设每个元素占
用 4 字节内存,one_dem 数组需要 4*m 字节的连续内存。表达式&one_dem[0]的值是
one_dem[0]的地址,也就是 one_dem[0]的起始地址;表达式&one_dem[1]的值是 one_dem[1]
的地址,也就是 one_dem[1]的起始地址;表达式(&one_dem[1])-(&one_dem[0])的值是 4,表
3