社区
C语言
帖子详情
关于指针操作(不直接操作指针)
123ppmove
2006-06-22 01:01:51
void HanA(char *pMon)
{
U8 aBuf[10];
//对应给aBuf赋值等操作;
memcpy(pMon,aBuf,10);
return;
}
我习惯于不直接操作指针,首先定义一个局部变量,对齐操作;然后再赋给指针;这样避免直接用指针带来的不安全因素;
但是在嵌入式系统中,这样增加了cpu的处理,变慢了,而且多占了变量空间;
我的问题是:我的这种方法好吗?还是直接用指针就行?
...全文
1230
27
打赏
收藏
关于指针操作(不直接操作指针)
void HanA(char *pMon) { U8 aBuf[10]; //对应给aBuf赋值等操作; memcpy(pMon,aBuf,10); return; } 我习惯于不直接操作指针,首先定义一个局部变量,对齐操作;然后再赋给指针;这样避免直接用指针带来的不安全因素; 但是在嵌入式系统中,这样增加了cpu的处理,变慢了,而且多占了变量空间; 我的问题是:我的这种方法好吗?还是直接用指针就行?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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++
指针
的13份资料
C/C++
指针
的13份资料 内容丰富,让编程人员不再害怕
指针
指针
数组与数组
指针
详解
指针
数组与数组
指针
详解1.什么是
指针
数组和数组
指针
?
指针
数组:
指针
数组可以说成是”
指针
的数组”,首先这个变量是一个数组,其次,”
指针
”修饰这个数组,意思是说这个数组的所有元素都是
指针
类型,在32位系统中,
指针
占四个字节。 数组
指针
:数组
指针
可以说成是”数组的
指针
”,首先这个变量是一个
指针
,其次,”数组”修饰这个
指针
,意思是说这个
指针
存放着一个数组的首地址,或者说这个
指针
指向一个数组的首地址。 根
C语言
指针
操作
(一)
指针
变量
C语言
指针
操作
(一)
指针
变量
C
指针
的知识点(初始化,赋值,函数
指针
,
指针
++)
1)
指针
的初始化
指针
初始化目的就是让
指针
知道指向那个地址。第一种方法就是在定义
指针
的同时告诉
指针
指向的地址,第二中情况,不在定义
指针
的时候初始化,而是把地址
直接
赋值给
指针
变量。注意:不可以在
指针
不清楚指向地址的情况下给
指针
赋值(但是char p=0或者p=NULL除外,该语句表示
指针
为空)。 第一种方法:在
指针
定义的时候告诉
指针
指向的地址。 下面这样初始化就是错误的: 第二中情况:不在定义指...
关于
指针
交换的
操作
关于
指针
交换的
操作
void swap1(int** p1, int** p2) {//交换
指针
int* temp; temp = *p1; *p1 = *p2; *p2 = temp; } void swap2(int* p1, int* p2) {//函数内交换
指针
,但无法改变函数外的地址 int* temp; temp = p1; p1 = p2; p2 = temp;...
C语言
70,024
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章