一个关于c语言指针问题(int**和int*)

上面的例子是错误的,下面的是正确的,可以解析一下吗?
感觉上面的例子跟平时的函数传地址没有什么不同呀(例如简单的swap函数)

img


这是swap函数

void swap(int *p1,int *p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}



#include "stdio.h"
#include "stdlib.h"

//这个函数演示传入一个指向int类型数据的指针
//然后尝试给该<指针>赋值
void functionA(int *input) {
    //先打印一下传进来时的指针指向地址,发现是nil,很合理
    printf("1 %p\n", input);
    //malloc分配在内存成功后会返回一个指针,尝试把新指针赋值给我们传进来的指针input
   input = malloc(10);
   //在打印一下指针的指向的地址,发现是有地址的了(0x56283cf5c670),也很合理
    printf("2 %p\n", input);

    //这个释放是我知道会发生内存泄漏才写在这的,如果不明白你问的问题,就会漏掉这个,发生内存泄漏
    free(input);
}

int main()
{
    int *data = NULL; //声明
    functionA(data);  //传入

    //这里再次打印,发现data=nil,意思是data没有能在functionA里面重新赋值成功
    printf("3 %p\n", data);
}

//为什么呢?
//首先传参是拷贝你传进去的东西,然后再在函数内部使用这个拷贝值.
//你传的是一个int*,这个类型的值是一个uint,
// input的值就是一个uint,代表内存地址,而*input的意思是uint指向的内存地址的里面的内容,并且其内容类型为int
//所以  input = malloc(10);  这句话的意思是一个uint赋值给了另一个uint,跟内存完全没有关系
//我们真正关心的其实是指针指向的内容
//
//所以,使用 void functionA(int **input) 
//**input的意思是: input是一个指针,它指向一个内存地址,里面还存了一个指向int型数据的指针
//因此  *input = malloc(10) 才能真正达到传进去再重新分配内存的目的
//如下:

/*
void functionA(int **input) {
    printf("1 %p\n", *input);
   *input = malloc(10);
    printf("2 %p\n", *input);
}
int main()
{
    int *data = NULL; 
    functionA(&data);  
    printf("3 %p\n", data);
}
*/