繁体   English   中英

打印指针值,增加C中的地址

[英]Printing pointer value with increment of the address in C

#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);
}

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

post increment operator 访问该值递增变量。

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

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

也许这个含有断言的代码会有所帮助。 如果在执行时指定的条件为false,则assert()宏将停止程序。 断言不会触发。

断言显示了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

不是,因为ptr ++在递增之前返回值,所以值为2。

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

*运算符适用于p ++的结果,它是原始p的值(在增量之前)。 所以它打印2 我想要打印3 ,你应该做(++ p),它返回递增的值。

*ptr++返回处的值ptr和然后递增,所以在第二printf()语句它只返回2,然后将其递增到3。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM