引用作为函数参数的例子,有很多知识点。
2013-11-25 10:22
295 查看
程序里的解释是自己的一点心得,只是其他的知识点在百度上基本上都可以查到,而且讲得很好,typedef用法参考资料。
运行结果:
而如果不使用引用,即init函数改成
则运行结果
我们发现调用init()函数前后list1中的数据成员并没有改变,这是因为,list1的值传进函数中head中后,head被malloc函数的返回值覆盖掉了,而head->next = NULL;修改的是新创建出来的node结构体内存块,当init()函数调用完了head就被释放了,而list1所指向内容没有被修改,这就是输出没有变化的原因了,但引用就不一样了,引用中,head是list1的一个别名,这样对head的修改同时也是对list1的修改,所以调用init()函数后输出是有变化的。
#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()函数后输出是有变化的。
相关文章推荐
- C++常量引用作为函数参数的例子
- C++ 引用和指针作为函数参数的例子。请不要拍砖
- C++结构体作为函数参数(值和引用)和返回值
- 对象作为函数参数时调用拷贝构造函数、引用做函数参数时只是传递地址
- C++数组:数组元素、存储引用以及作为函数参数
- 引用作为函数参数返回值
- JavaSE8基础 抽象类的引用作为函数的参数 指向的一定是子类的对象
- C# 引用类型作为函数参数时
- C# 引用类型作为函数参数时
- C++引用(作为函数参数和返回值)
- C++引用作为函数参数
- 作为函数参数的临时变量的引用必须是const的
- C# 引用类型作为函数参数时
- 指针和引用作为函数传递参数
- js 函数作为参数及返回值的例子
- 关于C中函数参数,指针-常量-引用解释的4个函数例子
- C++中,引用作为函数参数
- js 函数作为参数及返回值的例子
- C++引用作为函数的参数
- delphi 回调函数例子 用函数过程作为参数