关于在函数内部修改指针内容的问题

关于在函数内部修改指针内容的问题

1. 问题阐述

#include<stdio.h>

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

int main() {
	int* t=NULL;
	fun(&t);
	return 0;
}

在上面代码中的问题就是:将t的地址作为参数传入函数中,在执行了函数内部的操作后,t仍然是空值。

而出现这个问题的原因是:在函数参数传递的过程中,只是将t的副本传入函数,实际上t未被改变。

在这里插入图片描述

2.问题解决

1. 通过返回值传递分配的内存

在函数内部使用 malloc 或者其他分配内存的函数分配内存空间,并在函数结束前返回该内存指针。在函数外部,将返回的指针 赋值给一个变量,就可以在函数外部使用分配的内存。

// 函数内部分配内存,并返回分配的内存指针
int* fun() {
    int* p = (int*)malloc(sizeof(int));
    return p;
}

int main() {
    int* t = fun(); // 在函数外部使用函数内部分配的内存
    return 0;
}

用图来表示逻辑关系:

在这里插入图片描述

2. 通过指针参数传递分配的内存

在函数外部定义一个指针,将其地址作为参数传递给函数。在函数内部,通过指针参数将分配的内存指针赋值给函数外部定义的指针。这样,在函数外部就可以通过该指针访问函数内部分配的内存。

// 函数内部分配内存,并将分配的内存指针赋值给函数外部的指针
void fun(int** p) {
    *p = (int*)malloc(sizeof(int));
}

int main() {
    int* t;
    fun(&t); // 在函数外部使用函数内部分配的内存
    return 0;
}

用图来表示逻辑关系:

3. 关于双重指针补充知识

以char** p为例:

首先要知道 ‘ * ’ 运算符的结合性是从右往左,因此,**p相当于 *( p)。前面的char表示p指向的是char *型的数据,后面的( *p)表示p是个指针变量。

总的来说,p指向一个char指针变量(而这个char型指针变量指向一个char型数据)*p指的是p所指向的char指针变量的值(这个值往往是char型数据的地址)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值