/*
本程序介绍了三中通过子函数给指针赋值的方法,
比较有典型意义。
*
/
#include
#include
//通过返回值传递指针的值
int * func1()
{
//动态申请的内存,在子函数结束后才能依然存在而不被系统自动释放
//指针返回去才有意义
int *data=(int *)malloc(sizeof(int));
*data=100;
return data;
}
//通过指向指针的指针传递指针的值
void func2(int ** q)
{
//动态申请的内存,在子函数结束后才能依然存在而不被系统自动释放
//指针返回去才有意义
int *data=(int*)malloc(sizeof(int));
*data=200;
*q=data;
}
//通过指针的引用传递指针的值
void func2(int *& q)
{
//动态申请的内存,在子函数结束后才能依然存在而不被系统自动释放
//指针返回去才有意义
int *data=(int*)malloc(sizeof(int));
*data=300;
q=data;
}
main()
{
int *p;
p=func1();
printf("%d\n",*p);
func2(&p); //注意是取指针的地址,你的第二提问用这种方法就能解决
printf("%d\n",*p);
func2(p);
printf("%d\n",*p);
}
你这个样子写是不行的,因为k是个局部变量,当func函数返回时这个局部变量就失效了,i会指向一个无效的栈地址(可以使用,但是不安全,会随时被被的函数改动),你可以把k改成一个静态变量(static int k=0)或全局变量(把int k=0放到函数外面去),就可以这样写了
要通过函数传参数改变指针的值需要用指向指针的指针
也就是把
void func(int* i)
改成void func(int** i)
函数内
*i = &k;
#include
void mmm(int **a);
int k=5;
void main()
{
int*s;
mmm(&s);
printf("%d\n",*s);
}
void mmm(int **a)
{
*a=&k;
}