C语言关于传入子函数的指针形参的地址改变

        这个问题是在学习链表时遇到的,在做实验二的过程中想要实现插入(或删除)操作时,我们会调用子函数传入首元结点地址作为指针形参,通过一系列变化(一般是循环)找到待处理结点后进行相应处理。

 

        我们总能轻易地改变非首元结点之间的链式关系,处理过后首元结点地址(即指针形参)显然是不会改变的。但难免会出现新增一个结点插入在首元结点之前(或者删除掉首元结点)的情况,这时我们便想更改首元结点的地址,按照这个思路在子函数中给指针形参赋新生成结点的地址,运行结果却不尽人意。

        我们发现,即使是在子函数中更改了指针形参的地址,在子函数接下来的运行中确实更改,可当子函数结束后,主函数中当初传入子函数的实参地址并未发生上述相应的改变,也就是说,我们处理首元结点仅在子函数中生了效,在主函数中“头”还是“原来的头”。

案例一:

#include <stdio.h>
#include <stdlib.h>

void test(int *p)
{
	printf("2:%p\n",p);
	p=NULL;
	printf("3:%p\n",p);
}

int main()
{
	int *p;
	p=malloc(sizeof(int));
	printf("1:%p\n",p);
	test(p);
	printf("4:%p\n",p);
	return 0;
}

测试结果:

 像上述案例,我们在子函数中给指针形参NULL,在之后子函数中未结束时指针形参确实发生了改变,可当跳出子函数回归主函数时,我们发现当初传入的指针实参又恢复到刚生成时的地址,并没有因为在子函数中发生的改变而改变。

        那我们如何实现修改首元结点地址(指针形参)呢?

        我们可以在声明定义函数时,在其参数表中数据类型定义为“二级指针”,相应的我们给子函数传入指针的指针,放在这里来说就是传入“首元结点地址的地址”,在子函数中我们通过“二级指针”(首元结点地址的地址)修改“一级指针”(首元结点地址),这样就可避免案例一中的问题。

案例二:

#include <stdio.h>
#include <stdlib.h>

void test(int **p) //这里形参为“二级指针 ” 
{
	printf("2:%p\n",*p);
	*p=NULL;
	printf("3:%p\n",*p);
}

int main()
{
	int *p;
	p=malloc(sizeof(int));
	printf("1:%p\n",p);
	test(&p);//注意这里传入的是指针p的地址 
	printf("4:%p\n",p);
	return 0;
}

测试结果:

利用上述方法我们解决了这一问题,子函数中我们通过“二级指针”修改“一级指针”后,不仅在子函数中奏效,跳出子函数回归主函数时,我们发现当初传入的指针实参确实改变了地址。

        利用以上原理我们便可解决链表中各结点之间的关系问题,当处理的结点与首元结点无关,不用考虑首元结点地址的改变,当要改变首元结点地址,我们便采用上述方法。但是要注意,此时的子函数形参为二级指针,所以接下来的操作中不要忘记给传入参数名前加'*',用其一级指针进行连接删除相应操作;在主函数中调用该子函数时,记得传入的实参为二级指针,给原来的首元结点地址前加'&'。

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在C语言中,指针是一种重要的数据类型,它可以指向内存中的某个地址。在某些情况下,我们需要在函数中使用指针,并且还需要将其返回给调用者使用。 当我们要在函数修改某个变量的值,并且希望这个修改对调用者来说也有效时,可以通过传递指针来实现。具体而言,我们可以在函数的参数中声明一个指针类型的形参,通过指针间接地操作变量的值。在调用函数时,传递变量的地址作为实参,这样函数就可以通过指针修改变量的值。当函数执行完毕后,变量的值会被修改,并且在调用者中保持被修改后的值。 除了通过指针修改变量的值外,我们还可以将指针作为函数的返回值。这通常发生在需要在函数中动态分配内存,然后返回给调用者使用的情况下。例如,当我们在函数中使用malloc函数分配一块连续的内存空间时,可以通过指针将这个内存的首地址返回给调用者。这样调用者就可以自由地使用这块内存空间,并且在不需要时可以通过调用free函数释放掉。 总结起来,C语言中的指针可以作为函数形参修改变量的值,并且还可以作为返回值来返回动态分配的内存空间的地址。这样可以方便地在函数间传递数据,并且实现一些复杂的功能。 ### 回答2: 在C语言中,指针作为函数的参数是常见的用法,用于将数据从函数传递回主函数。然而,如果我们想要在函数修改指针的值,并让这个修改在主函数中生效,我们就需要将指针作为函数的返回值。 假设我们有一个主函数和一个函数,主函数中定义了一个指针变量ptr,并将地址传递给函数进行修改函数可以通过指针访问和修改指针指向的变量的值。但是,如果我们希望在主函数中也能够看到修改后的指针值,那么我们需要将指针作为函数的返回值。 具体操作是,函数中对指针进行修改后,将修改后的指针作为返回值返回给主函数。主函数可以通过接收返回值的方式来获取修改后的指针值,并继续使用。 这种用法非常常见,尤其是在需要动态分配内存的情况下。通过返回指针,我们可以将动态分配的内存地址传递给主函数,以便在程序的其他部分继续使用这块内存。 总之,C语言中的指针作为函数的返回值,可以让我们将对指针修改在主函数中生效,特别是在需要动态分配内存的情况下非常有用。使用这种方法,我们可以方便地传递和修改指针的值,实现更灵活的编程。 ### 回答3: 在C语言中,指针作为函数的参数传递,通常是为了实现对指针指向的内存地址或变量进行修改。当我们将指针作为函数的参数传递时,实际上是将指针变量的副本传递给函数。这样通过在函数中对传入指针进行操作,可以实现对原指针指向的内存地址或变量进行更改。 然而,在某些情况下,我们还需要将能够修改的结果返回给调用函数。这时,我们可以使用指针作为函数的返回值。具体而言,我们可以在函数中使用动态内存分配函数(如malloc函数)分配内存,并将需要修改的内容存放在该内存中。然后,我们将这块内存的地址作为函数的返回值返回给调用函数。 调用函数在接收函数的返回值时,可以使用一个指针变量来存储返回的地址。这样,调用函数就可以通过该指针来访问并修改函数中所分配的内存空间中的内容。 总之,C语言中,指针作为函数的参数传递可以实现对指针指向的内存地址或变量的修改,而指针作为函数的返回值可以将修改的结果返回给调用函数。这样,我们可以更加灵活地操作指针和内存空间,实现更复杂的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值