ssss
对于很多只学过C语言,没学过的C++的小伙伴,在刚开始学习数据结构的时候,会遇到C++引用“&”的概念,我们为什么使用它,简单的来说:一般实参能将本身的值传给形参,但我们修改形参之后,形参却不能将修改后的值传回给实参,这个过程是单向传递的过程.
具体实例看如下
#include
void sum(int x)
{
x = x + 1;
printf("%d\n", x);
}
main()
{
int x = 5;
printf("%d\n", x);
sum(x);
printf("%d\n", x);
}
在没有引用的的情况下
第一个主函数输出 5
第二个输出在定义的函数内部则是 6
第三个在主函数输出则还是5
原因是形参会开辟一个虚拟的地址,存放实参的变量,但在函数被调用完,便被释放,形参也就无法影响到实参.,
如果使用c++的引用&的情况下,实例如下
#include
void sum(int x)
{
x = x + 1;
printf("%d\n", x);
}
main()
{
int x = 5;
printf("%d\n", x);
sum(x);
printf("%d\n", x);
}
这里主要用c表示,只引用了C++“&“”的概念,用C编译器会报错,理解一下就行
输出结果
第一个主函数输出 5
第二个输出在定义的函数内部则是 6
第三个在主函数输出则是6
结果显示,形参引用了&之后,修改形参的值,可以传回实参
我们就大概能理解C++中的“&”的作用
&在C++的作用是引用传递,是C++非常重要的特性。引用传递能够将变量或对象本身作为参数传递,达到修改虚参而改变实参,并且不产生副本的效果。
那么只会C的小伙伴,C语言并没引用的概念,那么我们要怎么在C语言也能实现这样的效果,这时候我们就可利用指针的概念,同样也能将修改后的形参传回给实参,具体 *** 作如下
#include
void sum(int *x)
{
*x = *x + 1;
printf("%d\n", *x);
}
main()
{
int x = 5;
printf("%d\n", x);
sum(&x);
printf("%d\n", x);
}
我们看一下结果
第一个主函数输出 5
第二个输出在定义的函数内部则是 6
第三个在主函数输出则是6
事实证明,指正针也可以做C++中“&”的达到的效果。
那具体的是怎样实现的呢,简单的来说,
我们传递的形参是存放变量的地址,被调函数便可以在此地址基础上修改地址指向的内容,在函数被调用完,返回地址,地址返回和原来相同,但是地址上的内容已经被修改,也就是通过地址,修改地址上的内容,在返回原本的地址,使地址内容被改变,从而实现形参向实参传递。
相同的,如果形参不是想传递被修改变量的值,而是想传递被修改的指针变量,那么我们同样也可以取指针的指针,也就是二级指针,这在我们的数据结构C语言实现也经常会遇到。
下面我就举两个数据结构需要用到C++中引用(&)的概念,并纯C语言中实现:
实例1:
目的:将实参依次传入自定义的初始化函数initseqlist()、输入函数input()、输出函数print()的形参中,这过程要求都要形参的值返回实参返回实参;
让我们看引用C++中的&是怎么实现的
#include
#include
#include
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}List;
void initseqlist(List &L){
L.size = 0;
}
void input(List &L){
datatype x;
initseqlist(L);
printf("请输入一串数据,以“0”作为结束符");
scanf("%d",&x);
while(x){
L.a[L.size++] = x;
scanf("%d",&x);
}
}
void print(List &L){
int i;
for(i=0;i
这里只需要要在形参加入&便可以返回被修改的值给实参非常的方便
现在让我们看看用C怎么实现,代码如下
#include
#include
#include
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}List;
void initseqlist(List *L){
L->size = 0;
}
void input(List *L){
datatype x;
initseqlist(L);
printf("请输入一串数据,以“0”作为结束符");
scanf("%d",&x);
while(x){
L->a[L->size++] = x;
scanf("%d",&x);
}
}
void print(List *L){
int i;
for(i=0;isize;i++){
printf("%5d",L->a[i]);
}
}
int main()
{
List L;
initseqlist(&L);
input(&L);
print(&L);
}
在C语言中定义一个指针变量的形参,便可以修改实参的内容
注意 L->size 等价与 (*L).size,是另外一种写法
实例2
还有一种情况,在我们学习链表的时候需要我们在被调函数中修改指针,并能将修改后的指针返回给实参,这可咋整,之前是用指针来传递被修改的变量,那这会指正都要被修改了,这可咋整,没关系,思路是一样,我们给指针取地址,在指针的地址上去修改指针。
先看C++是怎么实现的
这里有两个自定义函数,一个创建单链表create()跟输出函数print()
目的,创建的单链表能在输出函数中输出(这就需要返回被修改的形参的值给实参了)
#include
#include
typedef int datetype;
typedef struct link_node{
datetype info;
struct link_node *next;
}node,*linklist;
void creat(linklist &head){
linklist s;
datetype x;
head = (linklist) malloc(sizeof(node));
printf("请输入若干个整数列");
scanf("%d",&x);
while(x){
s = (linklist)malloc(sizeof(node));
s->info = x;
s->next = head->next;
head->next = s;
scanf("%d",&x);
}
}
void print(linklist head){
linklist p;
p = head->next;
while(p){
printf("%5d",p->info);
p = p->next;
}
}
main(){
linklist head;
creat(head);
print(head);
}
C++还是一如既往,只需要在形参中的指正加入&,这样可以传递被修改的指针给实参。
那我们看看C语言中怎么实现
#include
#include
typedef int datetype;
typedef struct link_node{
datetype info;
struct link_node *next;
}node,*linklist;
void creat(linklist *head){
linklist s;
datetype x;
*head = (linklist) malloc(sizeof(node));
printf("请输入若干个整数列");
scanf("%d",&x);
while(x){
s = (linklist)malloc(sizeof(node));
s->info = x;
s->next = (*head)->next;
(*head)->next = s;
scanf("%d",&x);
}
}
void print(linklist head){
linklist p;
p = head->next;
while(p){
printf("%5d",p->info);
p = p->next;
}
}
main(){
linklist head;
creat(&head);
print(head);
}
不出意外,形参是取了指针的指针,这样也能达到修改后的指针被返回实参的效果。
这里再介绍一种方法,定义一个有返回值的函数,直接返回想要的结果
具体实现如下
#include
#include
typedef int datetype;
typedef struct link_node{
datetype info;
struct link_node *next;
}node,*linklist;
linklist creat(){
linklist head,s;
datetype x;
head = (linklist) malloc(sizeof(node));
printf("请输入若干个整数列");
scanf("%d",&x);
while(x){
s = (linklist)malloc(sizeof(node));
s->info = x;
s->next = head->next;
head->next = s;
scanf("%d",&x);
}
return head;
}
void print(linklist head){
linklist p;
p = head->next;
while(p){
printf("%5d",p->info);
p = p->next;
}
}
main(){
linklist head;
head = creat();
print(head);
}
这样的好处是不在需要在形参上做手脚,直接返回想要的值,但要注意的是,一定要正确定义返回值的类型,
这个方法缺点是,只能返回一个值,不过对于单链表也足够了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)