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

时间:2013-06-25 13:56:57

标签: c pointers

#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

7 个答案:

答案 0 :(得分:1)

post increment operator在访问该值后递增变量

因此, 获得*ptr后,ptr会增加{{1}}。

答案 1 :(得分:1)

正如其他人所说的那样,区别在于预递增(在取值之前增量发生)和后递增(取值之后然后发生增量)。当然应该打印出值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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

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