C语言中转换指针的意义

C语言中转换指针的意义,c,pointers,C,Pointers,我有以下代码 int a[5] = {20,-90, 450, -37,87}; int *p; for(p=a; (char *)p <((char*)a+sizeof(int)*5 );) // this line I don't understand *p++ = ++*p<60?*p:0; for(p=a; (char *)p <( (char*)a+sizeof(int)*5 );) printf("\n%d", *p++); inta[

我有以下代码

int a[5] = {20,-90, 450, -37,87};
int *p;

for(p=a; (char *)p <((char*)a+sizeof(int)*5 );) // this line I don't understand
      *p++ = ++*p<60?*p:0;

for(p=a; (char *)p <( (char*)a+sizeof(int)*5 );)
      printf("\n%d", *p++);
inta[5]={20,-90450,-37,87};
int*p;

对于(p=a;(char*)p而言,该转换的目的是确保在向指针添加
sizeof(int)
时,它会添加正确的字节数

最好不要使用强制转换,也不要使用
sizeof
。指针算法已经可以为您做到这一点了

如果一开始就编写可读的代码会更好。;-)

编辑:

我也会考虑使用这样的条件来解决数组大小变化的关注:

p < (a+ (sizeof(a) / sizeof(a[0])))

不管有什么疯狂的理由

(char*)p
说让我们把
p
当作指向char的指针

(char*)a
a
也有同样的说法

sizeof(int)*5是一个表示5
int


因此,
(char*)p共享代码的功能如何?强制转换的目的是让您一次迭代数组一个字节,而不是一次迭代一个int-仅此而已…@PaulR我希望*p++以sizeof(int)而不是以sizeof(char)递增指针哦,是的-我的错-在这种情况下,强制转换是毫无意义的,代码可以编写得更简单,非常感谢你。这就是我在考试中需要解决的问题:(在实时情况下,我不应该这样写,这让我发疯,为什么要教它呢??!再次感谢你
/tmp/foo.c:9:11: warning: unsequenced modification and access to 'p'
                 [-Wunsequenced]
    *p++ = ++*p<60?*p:0;
      ^       ~
1 warning generated.