RangerKnight 2022-11-14 04:16 采纳率: 66.7%
浏览 18
已结题

一道有关c/c++指针的读程序题求解

一道c/c++读程序题,求解答具体原因

题目代码如下:

#include <stdio.h>
#include <stdlib.h>
void fun(int *p1, int *p2, int *s) {
    s = (int *)malloc(sizeof(int));
    *s = *p1 + *(p2++);
}
int main() {
    int a[2] = {1, 2}, b[2] = {10, 20}, *s = a;
    fun(a, b, s);
    printf("%d \n", *s);
}

这个结果为什么是1呢?题目解析没太看懂,我自认为算的是11,s = 1 + 10 = 11没太理解等于1的这个原由,求解答,谢谢!
题目给的解析如下:

解析:
本题考查把数组名作为函数参数,执行fun函数后,s的值并没有发生变化,仍然是指向a,所以输出结果为1,选项C正确。

  • 写回答

3条回答 默认 最新

  • 谢玄. 2022-11-14 04:47
    关注

    注意 ! 在这里 s 是创建这个函数的时候的 新的 s 而不是 旧的 s 所以 如果修改了 s 原先的s并不会发生变化
    你可以复制下面的代码测试一下。

    #include <stdio.h>
    #include <stdlib.h>
    int* fun(int *p1, int *p2, int *s) {
        // 创建一个 空间 大小和 int 一致。
        // 并把空间的地址 给 s ;
        s = (int *)malloc(sizeof(int));
        // s 空间的值 = p1 空间的值 + p2 空间的值  并且 p2[0] ++ 
        *s = *p1 + *(p2++);
        
        // 注意 ! 在这里 s 是创建这个函数的时候的 新的 s 而不是 旧的 s 所以 如果修改了 s 原先的s并不会发生变化
        // 如果你需要改变原先的s就需要传入原先的地址 或者返回 新的 s 的地址
        
        return s;
    }
    int main() {
        int a[2] = {1, 2};
        int b[2] = {10, 20};
        // s = &a[0]
        int  *s = a;
        // 传入了地址 &a[0] , &b[0] , s 
        s = fun(a, b, s);
        printf("%d \n", *s);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    谢玄. 2022-11-14 04:49

    有用请采纳哦

    回复
    RangerKnight 2022-11-15 03:47

    非常感谢,通过您的解释我终于清楚意识到了问题和区别所在,再对照官方和他人的解释就完全理解了。

    回复
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 11月22日
  • 已采纳回答 11月15日
  • 创建了问题 11月14日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部