用指针给数组赋值的一个小问题

问题是这样的, 我打算输入与元素为数组赋值, 然后反向输出数组元素

# include <stdio.h>
	int main(void)
	{
    int a[10], * p = a, i;
    for (i = 0; i < 10; i++)
        scanf("%d", p++);
    for(i = 9; i >= 0; i--)         // 用指针输出时, i 仅仅用来控制循环次数,
    {
        // *p-- 相当于 *p, p--		// 10
     //  printf("%d ", *p);	 // 11
       // p--;				// 12
 	//   printf("%d ", *p--); // 13
        printf("%d ", a[i]);
    }

    return 0;
}

 
输出结果如下:
/*
注释掉13 行输出结果:
0 1 2 3 4 5 6 7 8 9
9 9 8 7 6 5 4 3 2 1

注释掉11, 22行输出结果:
0 1 2 3 4 5 6 7 8 9
9 9 8 7 6 5 4 3 2 1

注释掉11, 12, 13行输出结果:
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
*/
因为开始的输出结果不符合我的期望, 所以我就 用不同的 方法输出。
    结果是: 用数组方法输出是正确的, 但是用指针的方法却是error。

这时候 我有两个疑惑, 
第一: p是个指针。
    *p++ 相当于 *p, p++;  这个是我结论刚实验的。  // 见上面程序。

    但是教材上说的是, *p++, 因为 * 运算符与++yu==运算符处于同优先级,
        结合方向自右向左。因此等价于*(p++);

    问题就来了, *p++, 到底是先算那个?

第二:我觉得上面三种输出的方式的结果应该都是一样的, 但是输出的却不一样。
    我用指针输出时,
    for循环第一次时, p = &a[9];  输出a[9]的值; 然后 p–; 此时 p = &a[8];
                 第二次时, p = &a[8]; 输出a[8]的值;  然后p–;     此时p = &a[7];
                 ………………

                 知道p = &a[0]; 输出a[0]的值; p–; 此时因为 i 已经不满足for的条件了, 跳出循环。
    然而: 事实却是上面的结果。

对于第二个问题。 因为是指针输出的时候结果出错, 于是我想到是不是指针指向的地址不是我预料中的。我用下面的程序来验证我的思路。

for (i = 0; i < 10; i++)
    {
        printf("%#x\n", &a[i]);
    }
    printf("\n\n%#x\n", p);

 输出结果是:
0x60fee0
0x60fee4
0x60fee8
0x60feec
0x60fef0
0x60fef4
0x60fef8
0x60fefc
0x60ff00
0x60ff04

0x60ff08

可以清晰地看到, 给数组赋完值之后, p 的值并不是我想象中的 &a[9], 而是 &a[10]。
所以, 问题的根本原因是因为 
    for (i = 0; i < 10; i++)
        scanf(“%d”, p++);
输入所有的值之后, p++; 导致 p 指向不是a[9]。


对于第一个问题,优先级表格显示后缀++操作符的优先级高于操作符*, 但是这里实际上涉及三个步骤:

(1) ++操作符产生 p 的一份拷贝。

(2)然后++操作符增加 p 的值。

(3)最后在 p 的拷贝下执行 * 操作。

    原文作者:williamgavin
    原文地址: https://blog.csdn.net/williamgavin/article/details/72851058
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞