C 指针经验总结 ----- /*自己总结*/

85 篇文章 5 订阅

指看下面的例子

char *a1;
char *a2;
char b1;
switch(b1)
{
	case 0x01:
		a1 = &b1;
        	break;
	case 0x02:
		a2 = &b2;
		break;
	default break;
}

当b1等于0x01时 a1指向b1,此时*a1 = 0x01即b1的值。

当b1等于0x02时 a2指向b1,此时*a2 = 0x02即b1的值。好,此时问题来了,当b1等于0x02是,*a1是多少?

答案是:0x02,并不是0x01。

如果在程序其它地方,b1被赋其它值,如0x05,则*a1和*a2均为0x05。

在上述程序中,只要两个case语句被执行过后,a1就等于a2了。只要b1发生变化,*a1和*a2也跟着发送变化。

a1和a2中存储的只是b1的地址。只要b1没被销毁,a1和a2的值不会改变。


在血压计项目中:

struct firstPageDis{
char* termintim;
char* rectim;
char* teminpress;
char* recpress;
char* cyctimes;
} fpDis;


//取有效数据
uData = 0;
memset(dStr,'\0',10);
for(fCnt=0; fCnt<(recDataCnt-1); fCnt++)
{
dStr[fCnt] = rDataUart[1+fCnt]; //取出有效数据(ascii形式)
rDataUart[1+fCnt] &= 0x0F; //有效数据ascii转10进制
uData += rDataUart[1+fCnt] * pow(10,(recDataCnt-2-fCnt)); //计算有效数据(十进制方式)
}


//根据命令将有效数据赋值给各个参数,并定义各数据显示位置
memset(outStr,'\0',80);
switch(uCmd)
{
case CMDTERMINTIME:
tmTerBd = uData;
fpDis.termintim = &dStr;
strcpy(outStr, "LABL(32,150,25,200,'");
break;
case CMDRECTIME:
tmRecoy = uData;
fpDis.rectim = &dStr;
strcpy(outStr, "LABL(32,150,85,200,'");
break;
case CMDTERMINPRESS:
prTerBd = uData;
fpDis.terminpress = &dStr;
strcpy(outStr, "LABL(32,150,145,200,'");
break;
case CMDRECPRESS:
prRecoy = uData;
fpDis.recpress = &dStr;
strcpy(outStr, "LABL(32,150,205,200,'");
break;
case CMDCYCTIMES:
cycTimes = uData;
fpDis.cyctimes = &dStr;
strcpy(outStr, "LABL(32,150,265,200,'");
break;
default:
break;
}

如上程序所示,本意是每次输入数据后,根据不同命令下取到的参数要一一对应,参数字符也根据命令的不同赋值给不同的字符串fpDis.xxxx。

此时就出现了错误:

错误:保存参数字符的buf不应该是指针变量,如fpDis.terminpress (char *型)

因为获得数据后保存的buffer--dStr是一个固定的变量,不管用多少指针指向后,不会因为指针名称的改变,影响dStr的地址。

以为当命令是CMDTERMINTIME时,获得的数据(比如“ABC")保存到fpDis.termintim中,当命令是CMDCYCTIMES时,获得的数据(比如“DEF")保存到fpDis.cyctimes 中,但实际是只要每个分支执行过后,*fpDis.termintim 或 *fpDis.cyctimes的内容全跟着dStr时时在变,并且是相同值,无法单独保存”ABC“或"DEF"。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值