我试图理解指针是如何移动的。 以下是该计划,我知道 如果
int cs={1,2,3};
然后cs
指向cs[0]
我不清楚的是* cs指向的是什么。
#include<stdio.h>
int main()
{
int array[] = { 1, 2, 3, 4, 5 };
int *arrptr1 = array;
int *arrptr = array;
int i;
for (i = 0; i < sizeof(array) / sizeof(int); i++) {
printf("%d, %d, %d\n", array[i], *arrptr1++, *arrptr + i);
}
}
上述程序的输出是
1, 1, 1
2, 2, 2
3, 3, 3
4, 4, 4
5, 5, 5
然后我的理解*arrptr
应该增加存储在
*arrptr
应该增加1。 我观察到的是指针移动到下一个位置。所以我只想知道我的理解有什么问题?
更新
根据下面的回复,我理解
print("%d", *arrptr1++);
在这样的陈述中,对运营商的评价是从右到左。
因此,*arrptr1++
++
将首先评估arrptr
,然后*
再评估#include<stdio.h>
int main()
{
int array[] = { 10, 20, 30, 40, 50 };
int *q1 = array;
printf("q1 = %p\n",q1);
printf("*q1++ = %d\n",*q1++);
printf("q1 = %p\n",q1);
printf("*q1++ = %d\n",*q1);
}
所以要确认我写的另一个程序
q1 = 0x7ffffcff02e0
*q1++ = 10
q1 = 0x7ffffcff02e4
*q1++ = 20
上述程序的输出与上述逻辑的预期运算符优先级不同。 我得到的输出是
*q1++ = 10
所以我期待输出的第二行而不是*q1++ = 20
之后的{{1}}
运营商的优先权也没有发生在右边?
答案 0 :(得分:2)
*arrptr1++
被解析为*(arrptr1++)
,而不是(*arrptr1)++
。
答案 1 :(得分:2)
每当您同时对变量使用解除引用运算符*和预递增(预递减)或后递增(后递减)运算符时,操作顺序是从右到左(如果不使用括号)。
你想做的是
(*arrptr)++
因为()的优先级较高,它将强制编译器首先访问arrptr指向的元素,然后递增其值。
当你这样做时*arrptr++
,正如我所说,它首先运行最右边的运算符(即++)
然后是解引用运算符。
如果你要写
已编辑(仅限评论):*++arrptr // increment the pointer then access
它将首先推进指针然后访问该值 存储在arrptr现在指向的地址中。 还有一件事,用于分离函数参数的逗号不是逗号运算符,因此参数的求值顺序是未定义的。 (已被告知)
答案 2 :(得分:0)
会发生*arrptr1++
被解释为*(arrptr1++)
,这意味着每次在循环中指向数组的指针都会增加1,因此它将指向与array[i]
相同的元素。 {1}}。另一方面,*arrptr + i
被解释为“arrptr
指向的数组元素的值加上整数i
”。在这个循环中,它意味着它将显示与array[i]
相同的内容,但它不指向同一个元素(arrptr
始终指向数组中的第一个元素)。如果将数组中的值更改为更随机的值,则在再次运行程序时应该很明显。
答案 3 :(得分:0)
cs =&amp; cs [0](cs等于cs sub 0的地址); * cs = cs [0](cs指针等于cs sub 0);你应该记住*隐藏了[]。
// here is a print function with a pointer
int foo[5] = { 2, 9, 1, 3, 6};
int *walker, count;
walker = foo;
for (count = 0; count < 5; walker++, count++)
printf("Array[%d]: %d\n", count, *walker);
回顾:walker等于&amp; foo [0],所以当你增加walker(例如walker ++)时,你将指针移动到下一个地址foo [1]。当我们打印价值时,我们不能说......,沃克);因为walker(&amp; foo [whatever])指向一个地址,我们需要取消引用指针以获取值。同样,最重要的是要记住
array = &array[0] AND *array = array[0]