打印

MISAR中“禁止指针运算”的疑惑——

[复制链接]
2274|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Wxy8030|  楼主 | 2008-6-11 08:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
呆板书生| | 2008-6-11 11:46 | 只看该作者

fun 函数不够不规范

void fun(uchar *p)
{
    uchar i;

    for(i=0;i<10;i++)
    {
        *(p+i)=0;
    }
}

第一,为什么 i < 10,这个条件在函数中表达不够清楚。如果主程序中修改uchar x[10];的长度,这个函数就出错了。

第二,变量 i,是否会超过 uchar 的长度?

通常某些函数经过测试后,基本上就不改,即使外部的定义修改

使用特权

评论回复
板凳
Wxy8030|  楼主 | 2008-6-11 12:12 | 只看该作者

这里只讨论指针哈——

主要针对语句:
    *(p+i)=0;
做讨论。

其他的是我临时写写的,当然不够规范,嘿嘿,勿怪.......

使用特权

评论回复
地板
mohanwei| | 2008-6-11 12:31 | 只看该作者

没有什么问题,和p[i]=0;一样的

指针p是uchar型的,是确定而毫无歧义的。

使用特权

评论回复
5
zllfdd| | 2008-6-11 13:01 | 只看该作者

指针运算

指针运算有些情况下会出奇怪的错误,可能是因为编译器的不实现。

没必要完全遵守吧,那个标准太严了。

使用特权

评论回复
6
呆板书生| | 2008-6-11 15:54 | 只看该作者

这样写就不用指针了

void fun(uchar p[])
{
...
   p = 0;
...
}

使用特权

评论回复
7
IceAge| | 2008-6-11 21:22 | 只看该作者

顶呆板书生

我在以前的一个帖子里,说过用数组比指针更明确。

MISAR 很多规则的宗旨是清晰明确。

fun(uchar p[],int size), 你知道 p 是数组,当然也是指针,看到fun 这个函数的人一般自然会传递一个数组, 而不是任意的一个指针。

p = 0 与 *(p+i)=0,实际效果一样
但 p 对大多数人来说更直观,而*(p+i) 则需要一定的反应时间。同时compiler 的处理也可能不一样,最乐观的结果是二者一样,很多cpu 带有基地址变址指令,compiler可以很简单的处理 p

使用特权

评论回复
8
Wxy8030|  楼主 | 2008-6-17 16:50 | 只看该作者

to 呆板书生 和 IceAge

void fun(uchar p[])
{
...
   p = 0;
...



传递指针跟传递数组我认为有一个区别,传递数组,表示把这一数组里的数字传递给子函数使用,既然是传递,理论上就不应该允许它修改,或者说如果我把这个数组复制到另一个数组后给子函数使用,对于编译器来说应该是允许的;

而传递指针不同,传递指针是告诉子函数我目前这些变量的地址,但你可以将这些地址的数据读出,也可以改变;

所以既然要在主函数里改变数组里的值,就不能把“数组”传递给子函数,而应该只传“数组的指针”!

举个极端的例子:我定义一个变量,然后想在子函数里面改变这个变量,很显然传递这个变量的指针是唯一的办法,而不是直接传递这个变量。


希望兄弟们继续讨论.........

使用特权

评论回复
9
dld2| | 2008-6-17 17:03 | 只看该作者

对C老鸟来说

不让用指针,会憋出病来的。

使用特权

评论回复
10
machunshui| | 2008-6-17 17:38 | 只看该作者

上C++,用引用类型解决楼主的问题

上C++,用引用类型解决楼主的问题

使用特权

评论回复
11
IceAge| | 2008-6-17 20:17 | 只看该作者

to: Wxy8030

fun(uchar p[]) 与 func(uchar* p) 除了形式不同,没有本质不同。

fun(uchar p[]) 并不是传递整个数组,也是传递指针,p[] 只不过告诉你 p 是数组指针,而不是普通指针。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

146

主题

2100

帖子

2

粉丝