指针移动cs [1]和* cs ++之间有什么区别

时间:2011-06-23 07:18:36

标签: c arrays pointers

我试图理解指针是如何移动的。 以下是该计划,我知道 如果

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}} 运营商的优先权也没有发生在右边?

4 个答案:

答案 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]