指针复习

如果有一天,你走路要戴耳机,坐车要靠窗,走在路上不会大喊大叫,被问问题会沉默,你会发现安安静静的挺好。。。

----  网易云热评

一、返回栈区地址

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;

}

 

欢迎关注公众号:顺便编点程

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值