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

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

题目代码如下:

#include 
#include 
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正确。

注意 ! 在这里 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);
}

很简单啊,fun函数是个毫无意义的函数。因为函数内是不能修改指针参数自身的地址的。所以实际上s根本没有变化,*s就是s[0],s[0]就是1啊