单片机C语言学习心得
8、指针的使用
8.1 在定义的时候,*ap中的‘*’是指针类型说明符;
在进行指针预算时,x = *ap 中的‘*’是指针运算符。
8.2 如果在已定义好的指针变量,并引用,即
int *ap, int a;
ap = &a;
则在进行指针运算的时候:
(1) *ap与a是等价的,即 *ap就是a;
(2) &*ap:由于*ap与a等价,则&*ap与&a等价(地址);
(3) *&a:由于&a = ap,则*&a与*ap等价,即*&a与a等价(变量);
(4) *ap++相当于a++。
8.3 指向数组的指针变量的定义,应用,赋值:
int a[10]; int *app;
则有两种方法:app = &a[0]; 或 app = &a;
(1) app+I 或a+i就是数组元素a[i]的地址;
(2) *(app+i) 或 *(a+i) 就是元素a[i]中的内容;
(3) 指针变量也可以带下表,即app[i]与*(app+i)等价。
8.4 数组和指针可以互换,但在代码执行的效率上却大不相同。用数组找元素必须每次计算
元素的地址,效率不高;而用指针则直接指向某个元素,不必每次计算地址,可以大大的提高运算效率。
8.5 关于指针的运算:
(1) p++ (或p+=1):使指针p指向下一个数组元素,地址加1;
(2) *p++:先得到p指向的变量值,再执行p加1,指向下一个数组元素;
(3) *++p:先使p加1,指向下一个数组元素,再去p指向的变量值;
(4) (*p)++:表示p指向的变量值加1;
(5) 若p指向当前数组中的第i个元素,则:
(p--) 与a[i--] 等价:先执行*p,然后p自减;
(++p)与a[++i] 等价:先执行p自加,再执行*p;
(--p) 与a[--p] 等价:先执行p自减,再执行*p。
8.6 指向多维数组:
定义一个二维数组:a[3][4]; 定义一个指针变量:(*p)[4]; (注意:列数相同(第二维相同))
使指针变量指向数组:p = a;
此时: p与a等价:指向数组a[3][4]的第0行首地址;
p+1与a+1等价:指向数组a[3][4]的第1行首地址;
p+2与a+2等价:指向数组a[3][4]的第2行首地址;
而: *(p+1)+3与& a[1][3]等价,指向a[1][3]的地址; *(*(p+1)+3)与a[1][3]等价,表示a[1][3]的值; 一般的:对于数组a[i][j]来讲,有 *(p+i)+j相当于&a[i][j],表示第i行第j列元素的地址; *(*(p+i)+j)相当于a[i][j],表示第i行第j列元素的值。
8.7 指向结构体:
如果指针p指向结构体数组msg1[0]的首地址,则:
(1) (*p).flg与p->flg和msg1[0].flg三者完全等价,即 (*p).成员名 与p->成员名 以及 结


