[编程开发] 由指针传参引发的一点分析

昨天有同学(初学指针)在练习单链表和二叉树的时候,程序老是崩溃,或者得不到正确结果,于是向我求助。问题就出在指针的参数传递上,没传好指针导致内存混乱,其他代码基本全对。这个错误十分可惜。故在此我想做个记录,可能显得十分基础。

如果函数的参数是普通的一级指针,那么就意味着你只能使用指针、改变指针指向或者改变指向的目标变量。不能试图通过这个指针来申请内存。

void getMemory(int *p)
{
	p = (int *)malloc(sizeof(int) * 10);
}

void func()
{
	int *num = NULL;
	getMemory(num);
	// 指针p依旧是NULL指针
}
这是一个非常常见的错误。当发生函数调用的时候,函数的形参总是实参的一个copy(副本),就算是指针也是如此。例如上述的代码可以看成:在调用函数的时候,把num指向的目标地址赋值给p指针。现在num指针和p指针为两个完全不同的实体,它们同时指向了同一个目标地址。通过下面的代码可以验证这个说法。
#include <iostream>
using namespace std;

void getMemory(int *p)
{
  printf("target address of pointer p is: %x, its value is: %x\n", p, *p);
  printf("but address of pointer p itself is: [%x]\n", &p);
}


int main()
{
    int val = 4;
    printf("address of val is: %x\n", &val);
    int *num = &val;
    printf("target address of pointer num is:%x, its value is:%x\n", num, *num);
    printf("address of pointer num itself is: [%x]\n", &num);
    getMemory(num);

    // printf("%d %d %d\n", *p, *(p+1), *(p+2));

    getchar();
    return 0;
}
这样一来的话,形参上的p指针是一个新的指针,它的指向和原来的num指针一样,所以可以正常的修改目标地址的变量和进行输出。

现在函数中的p指针申请了新的内存,现在就很明显了:它的这个行为和原来的指针没有一点关系,那是p指针自己的事情。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值