单片机C语言学习心得_单片机c语言学习心得
单片机C语言学习心得由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单片机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->成员名 以及 结构体数组元素成员名三种形式是等价的;
(2)p+1:使指针指向结构数组msg1[0]的下一个元素msg1[1]的首地址;(3)由于指向运算符->的优先级高于自加运算符++,则:
(++p)->flg:先使p自加1指向msg1[1]的地址,再指向msg1[1]的flg成员值;(p++)->flg:先得到msg1[0].flg的值,再使p自加1指向msg1[1]的首地址;
p->flg++:先得到msg1[0].flg的值,使用完后再使msg1[0].flg的值加1; ++p->flg:先将msg1[0].flg的值加1,再使用。