c – 指针与= 1相同吗?

前端之家收集整理的这篇文章主要介绍了c – 指针与= 1相同吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想重构我的一些旧的C代码,我很好奇,如果我可以用ptr = 1替换所有ptr,其中ptris有一些指针,而不会改变任何行为.这是我的意思的一个例子,来自K& R Section 5.3:
/* strlen: return length of string s*/
int strlen(char *s)
{
    int n;
    for (n = 0; *s != '\0'; s++)
        n++;
    return n;
}

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

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++;
}

如果我替换行int_array;使用int_array = 1;,我得到相同的结果.

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

int a = 5;
int b = a++;

会成为:

int a = 5;
int b = a;
a += 1;

结论

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

这并不意味着您可以用x = 1替换所有x并期望相同的行为.但是,您可以安全地将x替换为(x = 1),因为它们是等效的.

解决方法

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

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

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

ptr = ptr + x;

相当于:

ptr = (ptr_type *)( (char *)ptr + x * sizeof(*ptr) );

无论你使用,=还是[](p [x]完全等同于*(p x))都是一样的;你甚至可以做4 [[Hello]]这样的事情.

猜你在找的C&C++相关文章