社区
C语言
帖子详情
关于指针操作(不直接操作指针)
123ppmove
2006-06-22 01:01:51
void HanA(char *pMon)
{
U8 aBuf[10];
//对应给aBuf赋值等操作;
memcpy(pMon,aBuf,10);
return;
}
我习惯于不直接操作指针,首先定义一个局部变量,对齐操作;然后再赋给指针;这样避免直接用指针带来的不安全因素;
但是在嵌入式系统中,这样增加了cpu的处理,变慢了,而且多占了变量空间;
我的问题是:我的这种方法好吗?还是直接用指针就行?
...全文
1218
27
打赏
收藏
关于指针操作(不直接操作指针)
void HanA(char *pMon) { U8 aBuf[10]; //对应给aBuf赋值等操作; memcpy(pMon,aBuf,10); return; } 我习惯于不直接操作指针,首先定义一个局部变量,对齐操作;然后再赋给指针;这样避免直接用指针带来的不安全因素; 但是在嵌入式系统中,这样增加了cpu的处理,变慢了,而且多占了变量空间; 我的问题是:我的这种方法好吗?还是直接用指针就行?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
精通C语言
指针
指针
被誉为C语言的精髓、C本质上是加了一层语法糖的汇编,引进当时先进的函数,保留了汇编强大的地址
直接
访问功能 ——
指针
,使其高效灵活。本课程是黄强老师对于
指针
的一次专题讲解,相信能给大家带来收获!
指针
数组与数组
指针
详解
指针
数组与数组
指针
详解1.什么是
指针
数组和数组
指针
?
指针
数组:
指针
数组可以说成是”
指针
的数组”,首先这个变量是一个数组,其次,”
指针
”修饰这个数组,意思是说这个数组的所有元素都是
指针
类型,在32位系统中,
指针
占四个字节。 数组
指针
:数组
指针
可以说成是”数组的
指针
”,首先这个变量是一个
指针
,其次,”数组”修饰这个
指针
,意思是说这个
指针
存放着一个数组的首地址,或者说这个
指针
指向一个数组的首地址。 根
C语言文件
指针
,如何对文件进行
操作
,文件
指针
FILE,指向文件
指针
C语言文件的定义,如何对文件进行
操作
,文件
指针
,如何定义指向文件的
指针
,通过文件
指针
对文件进行
操作
,文件应用举例,二进制文件相关
操作
,文件定位
C语言
指针
操作
(一)
指针
变量
C语言
指针
操作
(一)
指针
变量
C
指针
的知识点(初始化,赋值,函数
指针
,
指针
++)
1)
指针
的初始化
指针
初始化目的就是让
指针
知道指向那个地址。第一种方法就是在定义
指针
的同时告诉
指针
指向的地址,第二中情况,不在定义
指针
的时候初始化,而是把地址
直接
赋值给
指针
变量。注意:不可以在
指针
不清楚指向地址的情况下给
指针
赋值(但是char p=0或者p=NULL除外,该语句表示
指针
为空)。 第一种方法:在
指针
定义的时候告诉
指针
指向的地址。 下面这样初始化就是错误的: 第二中情况:不在定义指...
C语言
69,373
社区成员
243,079
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章