从单片机基础到程序框架(全集 2019pdf版).pdf - 第263页
发现它的好 处。 【60.5 指针与数组关联(绑定)时省略“&和下标[0]”的写法。 】 指针与数组 关联的时候, 通常是跟数组 的第 0 个元 素的地址关联 ,此时, 可以把数组 的“&和下 标[0]” 省略,比如 : unsigned c har* pu8; unsigned c har Buff er[3]; pu8=Buff er; //此行代码省略了 “&和下 标[0]” ,等效于 p u8=&…

【60.4 指针处理“批量数据”的基础知识。】
之所以有通过载体来“间接”操作普通变量的存在价值,其中很重要的原因是指针在处理“批量数据”
时特别给力,这里的“批量数据”是有条件的,要求这些数据的地址必须挨家挨户连起来的,不能是零零散
散的“散户”,比如说,数组就是由一堆在 RAM 空间里地址连续的变量组合而成,指针在很多时候就是为数
组而生的。先看一个例子如下:
unsigned char* pu8; //针对 unsigned char 类型变量的指针。凡是指针都是占 4 个字节!
unsigned char Buffer[3]; //普通的数组,内含 3 个变量,它们地址是相连的。
pu8=&Buffer[0]; //指针与普通变量 Buffer[0]发生关联(或者说绑定)。
*pu8=1; //通过指针这个载体来处理 Buffer[0]这个变量,此时 Buffer[0]变成了 1。
pu8=&Buffer[1]; //指针与普通变量 Buffer[1]发生关联(或者说绑定)。
*pu8=2; //通过指针这个载体来处理 Buffer[1]这个变量,此时 Buffer[1]变成了 2。
pu8=&Buffer[2]; //指针与普通变量 Buffer[2]发生关联(或者说绑定)。
*pu8=3; //通过指针这个载体来处理 Buffer[2]这个变量,此时 Buffer[2]变成了 3。
分析:上述例子中,并没有体现出指针的优越性,因为数组有 3 个元素,居然要绑定了 3 次,如果数组
有 1000 个元素,难道要绑定 1000 次?显然这样是繁琐低效不可取的。而要发挥指针的优越性,我们现在必
须深入了解一下指针的本质是什么,指针跟普通变量发生“绑定”的本质是什么。普通变量由“地址”和“地
址所装的数据”构成,指针是特殊的变量,它是由什么构成呢?其实,指针是由“地址”和“地址所装的变
量(或常量)的地址”组成。很明显,一个重要的区别是,普通变量装的数据,而指针装的是地址。正因为
指针装的是地址,所以指针可以有两种选择,第一种可以处理“装的地址”,第二种可以处理“装的地址的
所在数据”,这两种能力,就是指针的精华和本质所在,也是跟普通变量的区别所在。那么指针处理“装的
地址”的语法是什么样子的?请看例子如下:
unsigned char* pu8; //针对 unsigned char 类型变量的指针。凡是指针都是占 4 个字节!
unsigned char Buffer[3]; //普通的数组,内含 3 个变量,它们地址是相连的。
pu8=&Buffer[0]; //处理“装的地址”。把 Buffer[0]变量的地址装在指针这个载体里。
*pu8=1; //处理“装的地址的所在数据”。此时 Buffer[0]变成了 1。
pu8++; //处理“装的地址”。这里是“地址”自加 1,相当于指针此时装的是 Buffer[1]的地址。
*pu8=2; //处理“装的地址的所在数据”。此时 Buffer[1]变成了 2。
pu8++; //处理“装的地址”。这里是“地址”自加 1,相当于指针此时装的是 Buffer[2]的地址。
*pu8=3; //处理“装的地址的所在数据”。此时 Buffer[2]变成了 3。
上述例子中,利用“地址”自加 1 的操作,省去了 2 条赋值式的“绑定”操作(比如像 pu8=&Buffer[0]
这类语句),因此“绑定”本质其实就是更改指针所装的“变量(或常量)的地址”的操作。此例子中虽然
还没体现了出指针在数组处理时的优越性,但是利用指针处理“装的地址”这项功能,在实际项目中很容易

发现它的好处。
【60.5 指针与数组关联(绑定)时省略“&和下标[0]”的写法。】
指针与数组关联的时候,通常是跟数组的第 0 个元素的地址关联,此时,可以把数组的“&和下标[0]”
省略,比如:
unsigned char* pu8;
unsigned char Buffer[3];
pu8=Buffer; //此行代码省略了“&和下标[0]”,等效于 pu8=&Buffer[0];
【60.6 带 const 关键字的常量指针。】
指针也可以跟常量关联起来,处理常量,但是常量只能“读”不能“写”,所以通过指针操作常量的时
候也是只能“读”不能“写”。操作常量的指针用 const 关键词修饰,强调此指针只有“读”的操作。例子
如下:
const unsigned char* pCu8; //常量指针
code char Cu8Buffer[3]={5,6,7}; //常量数组
unsigned char b;
unsigned char c;
unsigned char d;
pCu8=Cu8Buffer; //此行代码省略了“&和下标[0]”,等效于 pCu8=&Cu8Buffer[0];
b=*pCu8; //读“装的地址的所在数据”。b 等于 5。
pCu8++; //所装的地址自加 1,跟 Cu8Buffer[1]关联
c=*pCu8; //读“装的地址的所在数据”。c 等于 6。
pCu8++; //所装的地址自加 1,跟 Cu8Buffer[2]关联
d=*pCu8; //读“装的地址的所在数据”。d 等于 7。
【60.7 例程练习和分析。】
现在编一个练习程序来熟悉指针的基础知识。
/*---C 语言学习区域的开始。-----------------------------------------------*/
unsigned char* pu8; //针对 unsigned char 类型变量的指针。凡是指针都是占 4 个字节!
unsigned char a=0; //普通的变量。
unsigned char Buffer[3]; //普通的数组,内含 3 个变量,它们地址是相连的。
const unsigned char* pCu8; //常量指针
code char Cu8Buffer[3]={5,6,7}; //常量数组

unsigned char b;
unsigned char c;
unsigned char d;
void main() //主函数
{
pu8=&a; //指针与普通变量发生关联(或者说绑定)。
*pu8=2; //通过指针这个载体来处理 a 这个变量,此时 a 从原来的 0 变成了 2。
pu8=&Buffer[0]; //处理“装的地址”。把 Buffer[0]变量的地址装在指针这个载体里。
*pu8=1; //处理“装的地址的所在数据”。此时 Buffer[0]变成了 1。
pu8++; //处理“装的地址”。这里是“地址”自加 1,相当于指针此时装的是 Buffer[1]的地址。
*pu8=2; //处理“装的地址的所在数据”。此时 Buffer[1]变成了 2。
pu8++; //处理“装的地址”。这里是“地址”自加 1,相当于指针此时装的是 Buffer[2]的地址。
*pu8=3; //处理“装的地址的所在数据”。此时 Buffer[2]变成了 3。
pCu8=Cu8Buffer; //此行代码省略了“&和下标[0]”,等效于 pCu8=&Cu8Buffer[0];
b=*pCu8; //读“装的地址的所在数据”。b 等于 5。
pCu8++; //所装的地址自加 1,跟 Cu8Buffer[1]关联
c=*pCu8; //读“装的地址的所在数据”。c 等于 6。
pCu8++; //所装的地址自加 1,跟 Cu8Buffer[2]关联
d=*pCu8; //读“装的地址的所在数据”。d 等于 7。
View(a); //把第 1 个数 a 发送到电脑端的串口助手软件上观察。
View(b); //把第 2 个数 b 发送到电脑端的串口助手软件上观察。
View(c); //把第 3 个数 c 发送到电脑端的串口助手软件上观察。
View(d); //把第 4 个数 d 发送到电脑端的串口助手软件上观察。
View(Buffer[0]); //把第 5 个数 Buffer[0]发送到电脑端的串口助手软件上观察。
View(Buffer[1]); //把第 6 个数 Buffer[1]发送到电脑端的串口助手软件上观察。
View(Buffer[2]); //把第 7 个数 Buffer[2]发送到电脑端的串口助手软件上观察。
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/