引用作为函数参数的例子,有很多知识点。

程序里的解释是自己的一点心得,只是其他的知识点在百度上基本上都可以查到,而且讲得很好,typedef用法参考资料

#include "stdafx.h"
#include <iostream.h>
#include <malloc.h>

/*---线性单链表的存储结构-----*/
typedef struct node
{
	int data;
	struct node * next;
}node,*list;

/*---定义结构体的初始化函数----*/
//--注意这里的形参是实参的一个引用,
//--即head是调用时()内变量的一个别名。
void init(list &head)

{
	head = (list)malloc(sizeof(node));
	head->next = NULL;
}

int main(int argc, char* argv[])
{
	node node1; //声明一个对象
	node1.data = 10; //初始化data数据成员
	list list1 = &node1; //定义一个list型变量也就是结构体指针

	cout<<list1->data<<endl; //此处输出的是10;
	cout<<list1->next<<endl;//一个未初始化的地址,不可预测

	init(list1); //调用初始化函数

	cout<<list1->data<<endl;//虽然分配了内存,但未初始化,不可预测
	cout<<list1->next<<endl;//此处应该输出的是NULL即0;
	return 0;
}


运行结果:


而如果不使用引用,即init函数改成

void init(list head)

{
	head = (list)malloc(sizeof(node));
	head->next = NULL;
}

则运行结果


我们发现调用init()函数前后list1中的数据成员并没有改变,这是因为,list1的值传进函数中head中后,head被malloc函数的返回值覆盖掉了,而head->next = NULL;修改的是新创建出来的node结构体内存块,当init()函数调用完了head就被释放了,而list1所指向内容没有被修改,这就是输出没有变化的原因了,但引用就不一样了,引用中,head是list1的一个别名,这样对head的修改同时也是对list1的修改,所以调用init()函数后输出是有变化的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值