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

问题是这样的, 我打算输入与元素为数组赋值, 然后反向输出数组元素
# 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 的拷贝下执行 * 操作。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将一个指针数组赋值给另一个指针数组,可以按照以下步骤进行操作: 1. 首先,创建两个指针数组,分别为源指针数组和目标指针数组。确保它们具有相同的元素类型和大小。 2. 使用循环遍历源指针数组中的每个元素,并将每个元素的值赋给目标指针数组相应位置的元素。 3. 注意,对于每个元素,只需将指针的值赋给目标指针数组,而不是复制指针指向的内容。这意味着目标指针数组中的每个元素将指向与源指针数组中相应元素相同的位置。 下面是一个示例代码,演示了如何将一个指针数组p1赋值给另一个指针数组p2: ```c++ int* p1 = p1[i]; // 将源指针数组中的每个元素的值赋给目标指针数组 } ``` 在上述示例中,我们使用循环遍历源指针数组p1,并使用赋值操作符将每个元素的值赋给目标指针数组p2中相应位置的元素。 请注意,这里只是将指针的值赋给了目标指针数组,而没有复制指针指向的内容。因此,目标指针数组中的每个元素将指向与源指针数组中相应元素相同的位置。 希望这个示例能帮助你理解如何将一个指针数组赋值给另一个指针数组。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [数组指针指针数组](https://blog.csdn.net/mick_hu/article/details/100931034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [深入理解数组指针指针数组的区别](https://download.csdn.net/download/weixin_38628150/13997421)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值