OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11253|回复: 14

C语言指针参数传递问题

[复制链接]

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
发表于 2017-5-10 21:23:13 | 显示全部楼层 |阅读模式
1金钱
oid *myfree(void *p)
{
        uint32_t number,i;
        u8 *q = p;//为什么这里要赋给一个局部指针,不直接使用P进行操作呢
       
        number=(uint32_t)((q-MEM_BUFF[0])/MEM_BLOCK_SIZE);
        for(i=number;i<(MEM_BCT_TAB[number].num+number);i++)
        {
                MEM_BCT_TAB.mem_state=0;
        }
        MEM_BCT_TAB[number].num=0;
       
        return (void *)0;       
}

最佳答案

查看完整内容[请看2#楼]

可以不赋值,只要编译没问题即可。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-5-10 21:23:14 | 显示全部楼层
可以不赋值,只要编译没问题即可。
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-5-10 21:47:02 | 显示全部楼层
额,根据我的理解,主要原因有2个
第一个:p是void *类型,而实际使用的是uint8_t *类型
第二个:程序员之间一个潜在的约定是不直接操作或者修改输入指针(因为输入的是指针,会直接修改数据,而如果使用传值就不会有这个问题),很多时候我们宁愿使用void *const p,当然这话不是我说的,我曾经看书上这么说过,具体我忘了
不足之处,还请指教。。。
电子爱好者
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-10 22:01:35 | 显示全部楼层
liuchang 发表于 2017-5-10 21:47
额,根据我的理解,主要原因有2个
第一个:p是void *类型,而实际使用的是uint8_t *类型
第二个:程序员 ...

但是,目的不就是为了更改数据内容吗。赋给另一个指针,也会更改数据内容吧?
回复

使用道具 举报

6

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2016-11-1
在线时间
64 小时
发表于 2017-5-10 23:02:04 | 显示全部楼层
二楼说的有道理,赋值给另一个指针不会改变数据内容,程序只是使用了p,没有改变p指向的内容吧
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-11 09:27:44 | 显示全部楼层
fankai 发表于 2017-5-10 23:02
二楼说的有道理,赋值给另一个指针不会改变数据内容,程序只是使用了p,没有改变p指向的内容吧

这个程序是没有改变,其他程序就不知道了。我想知道为什么要这么做
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2017-5-11 11:56:53 | 显示全部楼层
就是2F說的原因吧...
number=(uint32_t)(( q-MEM_BUFF[0])/MEM_BLOCK_SIZE);

要直接使用p, 也是可以
number=(uint32_t)(( (u8 *)p-MEM_BUFF[0])/MEM_BLOCK_SIZE);

回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-11 21:14:30 | 显示全部楼层
civic7366 发表于 2017-5-11 11:56
就是2F說的原因吧...
number=(uint32_t)(( q-MEM_BUFF[0])/MEM_BLOCK_SIZE);

void*声明函数的形参只是为了更好的接收不同类型的指针吧,局部定义的U8类型我觉得是,在内存分配的时候就是定义的U8类型,所以这样释放好点吧,我的重点不是这个啊,重点是我想知道直接用形参和局部参数的区别,用局部的相对于形参有什么好处吗
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-11 21:15:58 | 显示全部楼层
正点原子 发表于 2017-5-10 21:23
可以不赋值,只要编译没问题即可。

这么做的好处是什么呢,原子哥,我怎么没看到这条回复。。。我擦
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2017-5-12 08:55:47 | 显示全部楼层
zhoujianwen 发表于 2017-5-11 21:14
void*声明函数的形参只是为了更好的接收不同类型的指针吧,局部定义的U8类型我觉得是,在内存分配的时候 ...

你怎麼只看了原本2F的第一點, 不看人家的第二點呢....

回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-12 09:05:40 | 显示全部楼层
civic7366 发表于 2017-5-12 08:55
你怎麼只看了原本2F的第一點, 不看人家的第二點呢....

什么第一第二点?
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2017-5-12 11:44:45 | 显示全部楼层
zhoujianwen 发表于 2017-5-12 09:05
什么第一第二点?

第二个:程序员之间一个潜在的约定是不直接操作或者修改输入指针(因为输入的是指针,会直接修改数据,而如果使用传值就不会有这个问题),很多时候我们宁愿使用void *const p,当然这话不是我说的,我曾经看书上这么说过,具体我忘了

你不就一直在問, 幹嘛要用區域變數間接操作...有什麼好處...
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-12 12:26:02 | 显示全部楼层
civic7366 发表于 2017-5-12 11:44
第二个:程序员之间一个潜在的约定是不直接操作或者修改输入指针(因为输入的是指针,会直接修改数据,而 ...

..
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-5-12 15:23:07 | 显示全部楼层
楼主真是个可爱的固执的孩子...
都说了是"潜在的约定"了,没有硬性指标或者原因.
就像拉屎要去厕所,这就是我们大家之间"潜在的约定",但是拉屎一定要去厕所嘛???请参考印度人...
以下给出我参考的书籍(翻了好久才找到,完全是为了楼主...我也只能帮楼主到这里了...)参考来自<<嵌入式系统 高级C语言编程>> 001.png



电子爱好者
回复

使用道具 举报

87

主题

331

帖子

0

精华

高级会员

Rank: 4

积分
906
金钱
906
注册时间
2016-3-26
在线时间
116 小时
 楼主| 发表于 2017-5-12 20:34:13 | 显示全部楼层
liuchang 发表于 2017-5-12 15:23
楼主真是个可爱的固执的孩子...
都说了是"潜在的约定"了,没有硬性指标或者原因.
就像拉屎要去厕所,这就是 ...

大神我想继续看下去
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 03:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表