上面的例子是错误的,下面的是正确的,可以解析一下吗?
感觉上面的例子跟平时的函数传地址没有什么不同呀(例如简单的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);
}
*/