在C中用地址增量打印指针值 #包括 #包括 int main() { int k,*ptr=NULL; int arr[]={1,2,3,4,5,6,7,8,9,10}; ptr=arr; printf(“%d”,*ptr++); printf(“%d”,*(ptr++); printf(“%d”,(*ptr)++); printf(“%d”,*++ptr); printf(“%d”,++*ptr); }

在C中用地址增量打印指针值 #包括 #包括 int main() { int k,*ptr=NULL; int arr[]={1,2,3,4,5,6,7,8,9,10}; ptr=arr; printf(“%d”,*ptr++); printf(“%d”,*(ptr++); printf(“%d”,(*ptr)++); printf(“%d”,*++ptr); printf(“%d”,++*ptr); },c,pointers,C,Pointers,为什么第二个printf打印数字2?它应该打印3而不是,因为ptr++返回递增之前的值,因此该值为2。递增后操作符在访问该值之后递增variabl 因此,在获得*ptr后,即2,ptr会自行增加。*ptr++首先取消引用给出2的指针,然后递增指针 表达式*(ptr++)是一个增量后表达式,因此该表达式的值为ptr,然后递增。因此,表达式的结果是它仍然指向2,*运算符应用于p++的结果,即原始p的值(在增量之前)。所以它会打印2。我想打印3,您应该执行(++p)操作,返回递增的值。*ptr++返回

为什么第二个
printf
打印数字
2
?它应该打印
3

而不是,因为ptr++返回递增之前的值,因此该值为2。

递增后操作符在访问该值之后递增variabl


因此,在获得
*ptr
后,即2,
ptr
会自行增加。

*ptr++首先取消引用给出2的指针,然后递增指针
表达式*(ptr++)是一个增量后表达式,因此该表达式的值为ptr,然后递增。因此,表达式的结果是它仍然指向2

,*运算符应用于p++的结果,即原始p的值(在增量之前)。所以它会打印
2
。我想打印
3
,您应该执行(++p)操作,返回递增的值。

*ptr++
返回
ptr
处的值,然后递增,因此在第二个
printf()
语句中,它只返回2,然后递增到3。

它应该打印2,因为后缀运算符++首先返回值,然后递增。 在其周围添加括号(*(ptr++)不会影响增量。 该值将在整行之后递增


查看反汇编可能会帮助您了解该行发生的情况。

正如其他人所说,区别在于预增量(增量发生在获取值之前)和后增量(获取值之后再进行增量)。当然,应该打印值2

也许这段充满断言的代码会有所帮助。如果执行时指定的条件为false,则
assert()
宏将停止程序。这些断言不起作用

断言显示了
ptr
的值如何变化,以及数组中的值如何变化

#include <stdio.h>
#include <stdlib.h>

int main()
{
int k,*ptr=NULL;
int arr[]={1,2,3,4,5,6,7,8,9,10};
ptr=arr;
printf("%d ",*ptr++);
printf("%d ",*(ptr++));
printf("%d ",(*ptr)++);
printf("%d ",*++ptr);
printf("%d ",++*ptr);
}

为什么它要精确地打印3?你在做增量后而不是增量前。这就是为什么将增量与您想对增量变量执行的任何操作分开执行是个好主意。啊!所以它和“*ptr++”一样,对吗?这个()就是用来欺骗我们的,对吧?在这种情况下是的*(ptr++->增加ptr并返回“2”上的指针,因此printf display 2.ah!所以它和“*ptr++”一样,对吗?()只是用来欺骗我们的,对吗?@YuHao不,后缀
++
的优先级比间接运算符
*
的优先级高<代码>*ptr++和
*(ptr++)
完全相同。非常感谢您抽出时间。。现在我明白了:)
#include <assert.h>
#include <stdio.h>

int main(void)
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int *ptr = arr;

    assert(ptr == &arr[0]);
    printf("%d\n",*ptr++);      // print 1; ptr = &arr[1]
    assert(ptr == &arr[1]);
    printf("%d\n",*(ptr++));    // print 2; ptr = &arr[2]
    assert(ptr == &arr[2]);
    assert(*ptr == 3);
    printf("%d\n",(*ptr)++);    // print 3; ptr = &arr[2]; arr[2] = 4
    assert(ptr == &arr[2]);
    assert(*ptr == 4);
    printf("%d\n",*++ptr);      // print 4; ptr = &arr[3]
    assert(ptr == &arr[3]);
    assert(*ptr == 4);
    printf("%d\n",++*ptr);      // print 5; ptr = &arr[3]; arr[3] = 5
    assert(ptr == &arr[3]);
    assert(*ptr == 5);

    printf("Offset: %d\n", (int)(ptr - arr));
    for (int i = 0; i < 9; i++)
        printf("a[%d] = %d\n", i, arr[i]);
    return 0;
}
1
2
3
4
5
Offset: 3
a[0] = 1
a[1] = 2
a[2] = 4
a[3] = 5
a[4] = 5
a[5] = 6
a[6] = 7
a[7] = 8
a[8] = 9