二级指针

在传递一级指针时,只有对指针所指向的内存变量做操作才是有效的;

在传递二级指针时,只有对指针的指向做改变才是有效的;

下面做简单的分析:

在函数传递参数时,编译器总会为每个函数参数制作一个副本,即拷贝;

例如:

void fun(int *p),指针参数p的副本为_p,编译器使_p=p,_p和p指向相同的内存空间,如果在函数内修改了_p所指向的内容,就会导致p的内容也做相应的改变;

但如果在函数内_p申请了新的内存空间或者指向其他内存空间,则_p指向了新的内存空间,而p依旧指向原来的内存空间,因此函数返回后p还是原来的p。

这样的话,不但没有实现功能,反而每次都申请新的内存空间,而又得不到释放,因为没有将该内存空间的地址传递出来,容易造成内存泄露。

void fun(int **p),如果函数参数是指针的地址,则可以通过该参数p将新分配或新指向的内存地址传递出来,这样就实现了有效的指针操作。

#include<stdio.h>
#include<malloc.h>

typedef struct list {
    int data;
}list_t, *list_pt;
void pp(list_t ** x) {
	//  此时 x是&tmp拷贝,直接输出x的值为tmp的地址
    printf("&x=%d\n", &x);    // 打印x的地址,与tmp的地址不一样
    printf("x=%d\n", x);      // 输出x的值为tmp的地址
    printf("*x=%d\n", *x);    // 输出的为tmp的值,也就是结构体内存的首地址
    printf("**x=%d\n", **x);  // 输出的为结构体的首地址为起始的int长度的值
    int tmp1 = 5;
    x = &tmp1;   //此时x指向的值是新的tmp1  ,当此处x为*x时,即为tmp的指向变为了tmp1的地址
    printf("%d\n",*x);
}
int main()
{
    list_pt tmp = NULL;

    tmp = (list_pt)malloc(sizeof(list_t));
    tmp->data = 10;
    printf("tmp=%d\n", tmp);
    printf("&tmp=%d\n", &tmp);   //打印tmp指针的地址
    pp(&tmp);    //传入tmp的地址
    printf("%d\n", *tmp);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值