规则17.4 只允许用数组索引做指针运算
按照如下方式定义数组和指针:
uint8_t a[10];
unit8_t *p;
p = a;
则*(p+5) = 0是不允许的,而p[5] = 0 则是允许的,尽管就这段程序而言,二者等价。
以下给出一段程序,读者可参照相应程序行的注释,细细品位上述规则的含义。
void my_fun(uint * _t * p1, uint8_t p2[])
{
uint8_t index = 0;
uint8_t *p3;
uint8_t *p4;
*p1 = 0;
p1 ++; /* 不允许, p1不是指向数组的指针 */
p1 = p1 +5; /* 不允许, p1不是指向数组的指针 */
p1[5] = 0; /* 不允许, p1不是指向数组的指针 */
p3 = &p1[5];
p2[0] = 0;
index ++;
index = index + 5;
p2[index] = 0; /*允许*/
*(p2+index) = 0; /* 不允许 */
p4 = &p2[5]; /*允许*/
}
那如果是这样的话,是不是我就不能写像 memcpy(void* des, void * src, UINT32 len)这样的函数头,因为函数中一定会使用指针加减操作所指向的内存??
而是要写成memcpy(UINT8 des[], UINT8 src[], UINT32 len) ???
印象中,偶的编译器是支持的哈
为什么不允许?
郁闷
。。。。
好像几个平台都可以这么写的,为啥不行?