关于指针操作(不直接操作指针)

123ppmove 2006-06-22 01:01:51
void HanA(char *pMon)
{
U8 aBuf[10];

//对应给aBuf赋值等操作;
memcpy(pMon,aBuf,10);
return;
}
我习惯于不直接操作指针,首先定义一个局部变量,对齐操作;然后再赋给指针;这样避免直接用指针带来的不安全因素;
但是在嵌入式系统中,这样增加了cpu的处理,变慢了,而且多占了变量空间;

我的问题是:我的这种方法好吗?还是直接用指针就行?
...全文
1218 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
123ppmove 2006-07-17
  • 打赏
  • 举报
回复
谢谢各位!非常感谢;有收获!
qifa 2006-06-30
  • 打赏
  • 举报
回复
传进来的指针本身就是原指针的一个副本,没有必要再定义本地变量了,如果说怕在不断的改变指针所指向的内容而变得不安全,那是多CPU和多线程同步需要考虑的问题
xugang_2001 2006-06-30
  • 打赏
  • 举报
回复
我在做项目的时候还是和楼主一样的原则,这样更安全一些。
特别是代码量大,变化复杂的时候感觉还是很有必要的,可以大大减少错误的发生。
值得推荐,但是为什么会因此影响效率不是很理解。
htqx 2006-06-29
  • 打赏
  • 举报
回复

个人认为使用内部数组来缓冲数据,相当有道理。
void HanA(char *pMon)
{
U8 aBuf[10];

//对应给aBuf赋值等操作;
memcpy(pMon,aBuf,10);
return;
}
pMon 是什么?很明显是一个字符串,而不是个字符指针。
不直接操作字符串,是一个设计原则。

当然,根据具体要求,可能并不需要什么缓冲。


al0n9 2006-06-29
  • 打赏
  • 举报
回复
void HanA(char *pMon)
{
U8 aBuf[10];
//对应给aBuf赋值等操作;
memcpy(pMon,aBuf,10); //楼主这里有一个错误,实际上应该是memcpy(aBuf, pMon, 10);
return;
}
这种情况,应该直接操作pMon,因为函数定义中是char *,而不是char const *,如果调用者担心pMon指向的内容被修改,就应该自己保留备份。

如果换成下面的:
void HanA(char char *pMon)
{
U8 aBuf[10];

memcpy(aBuf, pMon,10);
return;
}
在这种情况下,如果函数内部想改动pMon指向的内容,就必须定义一个数组,生成一个副本。
至于
void HanA(char *pMon)
{
char *p = pMon; //这样操作比较好,不会对pMon修改而造成副影响
//其他操作
return;
}
就只有在一种情况下才有意义:要用p来指向数组中的不同位置。 实际上,pMon就是一个局部变量,pMon的变化并不会改变pMon所指向的内容,所以,也不会对调用者产生任何的副作用。

123ppmove 2006-06-28
  • 打赏
  • 举报
回复
请继续讨论;谢谢;
cmoring 2006-06-28
  • 打赏
  • 举报
回复
这个问题我曾经与华为的人讨论过,结果也是出现了以上2种不同的争论。
个人认为:没必要增加一个局部变量,直接用指针就可以了。
meicaikourou 2006-06-28
  • 打赏
  • 举报
回复
多此一举
123ppmove 2006-06-23
  • 打赏
  • 举报
回复
我所说的方法不就是想不直接用指针吗?就是怕把指针给改变了;所以才用局部变量;最后才把局部变量copy给指针;我怎么觉得挺好的呢?
tailzhou 2006-06-23
  • 打赏
  • 举报
回复
void HanA(char *pMon)
{
U8 aBuf[10];

//对应给aBuf赋值等操作;
memcpy(pMon,aBuf,10);
return;
}

如果你需要修改之中的内容,并且又不想影响反映到函数外,那么只能使用副本;

如果你不需要修改其内容,还不如把参数申明成指向常量的指针,直接用指针就可以了。
Tycool 2006-06-23
  • 打赏
  • 举报
回复
多了局部变量,时间慢一般的问题不用考虑(即使在嵌入式)。但因为增加了风险所以强烈反对!
这样的指针传进来是用来修改指向的内容的,直接用就行了。
你用局部指针是因为怕传进来的指针本身被修改吧?这是错误的认识!
在函数内部不应该对指针本身进行修改!(即使修改了,也只是修改了指针的一个隐身的副本,出了函数,指针根本还指在原地!)
avalonBBS 2006-06-23
  • 打赏
  • 举报
回复

void HanA(char *pMon)
----------------------------------
pMon本身是不会变的(在HanA中),在C中没有传址,这还是传值,至于传的是地址还是变量,C不管。
如果你在意pMon所指的内容的话,那么在HanA返回前,对其内容进行一些检查。
asusa3a 2006-06-23
  • 打赏
  • 举报
回复
为什么这么说呢?因为参数传递的是指针,是地址传递不是值传递;如果直接用形参的*sum 进行求和,每一步都直接改变了实际参数的值,因而存在危险。
而设置一个局部变量先求和,然后型参指针指向最后结果,中途不会改变实际参数的值,因而比较稳妥。

这家伙这段话不错


如果开发时间充裕,我是绝对不肯多用一个可有可无的变量。
这家伙这句话不错。
gongzhl 2006-06-23
  • 打赏
  • 举报
回复
void HanA(char *pMon)
{
char *p = pMon; //这样操作比较好,不会对pMon修改而造成副影响
//其他操作
return;
}
同意这个。
ddl001122 2006-06-23
  • 打赏
  • 举报
回复
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count ;
int sum_temp;

sum_temp = 0;
for (count = 0; count < num; count ++)
{
sum_temp += data[count];
}

*sum = sum_temp;
}
为什么不用这个呢?
int sum_data( unsigned int num, int *data)
{
unsigned int count ;
int sum = 0;

for (count = 0; count < num; ++count)
{
sum += data[count];
}

return sum;
}
feny911 2006-06-23
  • 打赏
  • 举报
回复
这种东西不可能有定论。
楼主既然知道这样做的优缺点,自己选择了。

如果开发时间充裕,我是绝对不肯多用一个可有可无的变量。
sharpdew 2006-06-22
  • 打赏
  • 举报
回复
呵呵,我最喜欢指针了,还真没啥理由
happytang 2006-06-22
  • 打赏
  • 举报
回复
若改为如下,则更好些。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count ;
int sum_temp;

sum_temp = 0;
for (count = 0; count < num; count ++)
{
sum_temp += data[count];
}

*sum = sum_temp;
}
//////////////////////////////////////////////////
为什么这么说呢?因为参数传递的是指针,是地址传递不是值传递;如果直接用形参的*sum 进行求和,每一步都直接改变了实际参数的值,因而存在危险。
而设置一个局部变量先求和,然后型参指针指向最后结果,中途不会改变实际参数的值,因而比较稳妥。

而该直接用指针的时候要直接用,方便快捷啊
zidane_yubo 2006-06-22
  • 打赏
  • 举报
回复
直接用指针
你这样用 反而容易出错
123ppmove 2006-06-22
  • 打赏
  • 举报
回复
我是参考如下规则才这样做的,难道是我理解错了:???
防止将函数的参数作为工作变量。
说明:将函数的参数作为工作变量,有可能错误地改变参数内容,所以很危险。对必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。
示例:下函数的实现不太好。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count;

*sum = 0;
for (count = 0; count < num; count++)
{
*sum += data[count]; // sum成了工作变量,不太好。
}
}

若改为如下,则更好些。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count ;
int sum_temp;

sum_temp = 0;
for (count = 0; count < num; count ++)
{
sum_temp += data[count];
}

*sum = sum_temp;
}
加载更多回复(7)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧