对于指针,++与+ = 1相同吗?

Mik*_*ols 6 c pointers post-increment

我想重构我的一些旧的C代码,我很好奇,如果我可以取代所有ptr++ptr += 1其中ptr一些指针,在不改变任何行为.以下是K&R第5.3节中我的意思的一个例子:

/* strlen: return length of string s*/
int strlen(char *s)
{
    int n;
    for (n = 0; *s != '\0'; s++)
        n++;
    return n;
}
Run Code Online (Sandbox Code Playgroud)

当我替换s++使用时s += 1,我得到相同的结果,但我想知道是否所有类型的情况.我也做了ints 测试:

int size = 10;
int *int_array = (int*)calloc(size, sizeof(int));
for (int i = 0; i < size; i++)
    int_array[i] = i;

for (int i = 0; i < size; i++) {
    printf("*int_array = %d\n", i, *int_array);
    int_array++;
}
Run Code Online (Sandbox Code Playgroud)

如果我更换线int_array++;int_array += 1;,我得到了相同的结果.

在考虑了这个之后,我意识到如果在表达式中使用该值可能会出现问题.是否更安全我只是将增量移动到另一条线上,如下所示:

int a = 5;
int b = a++;
Run Code Online (Sandbox Code Playgroud)

会成为:

int a = 5;
int b = a;
a += 1;
Run Code Online (Sandbox Code Playgroud)

结论

我认为可能是一个问题,增加不同类型的指针,不是问题.请参阅@ bdonlan的回复原因.

这并不意味着你可以取代所有x++x += 1和预期相同的行为.你可以,但是,替代++x(x += 1)安全,因为它们是等价的.

bdo*_*lan 12

a += 1相当于++a(C99§6.5.3.1/ 2).在这样的行中int b = a++;意味着它等同于a++; a++将返回a,同时a += 1返回新值.

请注意,如果您不使用结果a++(即,您有一个仅包含的语句a++;),那么它们实际上是相同的.

另请注意,_all指针算法以指向类型大小(§6.5.6/ 8)的增量完成.这意味着:

ptr = ptr + x;
Run Code Online (Sandbox Code Playgroud)

相当于:

ptr = (ptr_type *)( (char *)ptr + x * sizeof(*ptr) );
Run Code Online (Sandbox Code Playgroud)

这是相同的,你是否使用+,++,+=,或[](p[x]完全等同于*(p + x),你甚至可以做这样的事情4["Hello"],因为这一点).

  • @Pubby,见C99§6.2.5/ 20,§6.2.6.1/ 4,§6.3.2.3/ 7.C要求连续分配数组,并且它们的组成对象具有一些CHAR_BIT位的固定大小.我们通过算术得到一个指向数组元素的字符指针,该指针等价于C所需的; 因此`(char*)p + sizeof(*p)*x ==(char*)&p [x]`.进一步6.3.2.3/7要求我们可以将指针转换回对象类型(因为它正确对齐),因此我们返回到`&p [x]`.它没有直接说明,但实施的限制实际上需要这个,IOW. (2认同)