[英]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.