指针值传递、址传递

指针值传递、址传递

1. 值传递

  • p 作为参数传入函数 fun(char* tmp)
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void fun(char* tmp)
{
    printf("tmp = %p\n", tmp);

    tmp = (char*)malloc(sizeof(char));
    printf("tmp = %p\n", tmp);

    strcpy(tmp,"hello");
    printf("content of tmp = %s\n", tmp);

    //free(p)
}

int main(void)
{
    char* p = NULL;
    printf("p = %p\n", p);

    fun(p);
    printf("p = %p, content of p = %s\n", p, p);

    return 0;
}
p = (nil)
tmp = (nil)
tmp = 0x7fffb7f116b0
content of tmp = hello
p = (nil), content of p = (null)
  1. 主函数main中,局部的指针变量p入栈。

在这里插入图片描述

  1. 程序执行到fun()函数中,形参tmp拷贝了实参p的值,为NULL。

    • 此时:
      • p = NULL,&p = 0xYYYY
      • tmp = NULL,&tmp = 0xYYYY - offset

在这里插入图片描述

  1. malloc申请了一段内存空间给到tmp,将字符串复制到tmp,没有改变到main中的p指针。
    • 此时:
      • p = NULL,&p = 0xYYYY
      • tmp = 0xMMMM,&tmp = 0xYYYY - offset

在这里插入图片描述

2. 址传递

  • &p 作为参数传入 fun(char** tmp)
#include <stdio.h>
#include <string.h>
#include <malloc.h>

void fun(char** tmp){
    printf("tmp = %p\n", tmp);
    *tmp = (char*)malloc(sizeof(char) * 10);
    printf("tmp = %p\n", *tmp);
    
    strcpy(*tmp,"hello");
    printf("content of tmp = %s\n", *tmp);

    //free(p)
}

int main(void){
    char* p = NULL;
    
    printf("p = %p, &p = %p\n", p, &p);

    fun(&p);

    printf("p = %p, content of p = %s\n", p, p);
    
    return 0;
}
p = (nil), &p = 0x7fffe18d8600
tmp = 0x7fffe18d8600
tmp = 0x7fffd975d6b0
content of tmp = hello
p = 0x7fffd975d6b0, content of p = hello
  1. 主函数main中,局部的指针变量p入栈。

在这里插入图片描述

  1. &p传入函数fun(char** tmp),tmp的值就是&p,存入fun的栈帧中。
    • 此时:
      • p = NULL,&p = 0xYYYY
      • tmp = 0xYYYY,&tmp = 0xYYYY - offset,*tmp = NULL

在这里插入图片描述

  1. malloc申请了一段内存空间给到 *tmp,*tmp=0xMMMM,tmp=&p,也即p指向0xMMMM,退出fun()后,p还是指向的0xMMMM,被改变。
    • 此时:
      • p = 0xMMMM,&p = 0xYYYY
      • tmp = 0xYYYY,&tmp = 0xYYYY - offset,*tmp =(*0xYYYY) = 0xMMMM

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

uuxiang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值