如果有一天,你走路要戴耳机,坐车要靠窗,走在路上不会大喊大叫,被问问题会沉默,你会发现安安静静的挺好。。。
---- 网易云热评
一、返回栈区地址
int *fun()
{
int a = 10;
return &a; //函数调用完毕,a释放
}
int main(int argc,char *argv[]) {
int* p = NULL;
p = fun();
*p = 100; //操作野指针指向的内存,容易报错
system("pause");
return 0;
}
二、返回data区地址
int *fun()
{
static int a = 10; //函数调用完毕,a不释放
return &a;
}
int main(int argc,char *argv[]) {
int* p = NULL;
p = fun();
*p = 100;
printf("p=%d\n", *p);
system("pause");
return 0;
}
三、值传递
void fun(int *tmp)
{
tmp = (int *)malloc(sizeof(int));//堆区分配空间,将地址传递给tmp
*tmp = 100;//将堆区的地址里面的值修改为100
}
int main(int argc,char *argv[]) {
int* p = NULL;
fun(p);//值传递,形参修改不会影响实参
printf("p=%d\n",*p);//err,操作空指针指向的内存
system("pause");
return 0;
}
void fun(int *tmp)
{
*tmp = 100;
}
int main(int argc,char *argv[]) {
int* p = NULL;
p = (int*)malloc(sizeof(int));
fun(p);//值传递
printf("p=%d\n",*p);//成功打印
system("pause");
return 0;
}
四、返回堆地址
void *fun()
{
int* tmp = NULL;
tmp = (int*)malloc(sizeof(int));
*tmp = 100;
return tmp;//返回堆区地址,函数调用完毕,不释放
}
int main(int argc,char *argv[]) {
int* p = NULL;
p=fun();//值传递
printf("p=%d\n",*p);
if (p != NULL)
{
free(p);
p = NULL;
}
system("pause");
return 0;
}
五、二级指针
void fun(int **tmp)
{
*tmp = (int*)malloc(sizeof(int));
**tmp = 100;
}
int main(int argc,char *argv[]) {
int* p = NULL;
fun(&p);
printf("*p=%d\n", *p);
system("pause");
return 0;
}
欢迎关注公众号:顺便编点程