单片机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->成员名 以及 结

单片机C语言学习心得相关文档

最新文档

返回顶部