你知道纯C单链表跟C++单链表的区别吗?!引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList &L

函数参数传递的两种方式为值传递和引用传递

1.传值方式传参

c语言是按值传递的,在函数中被传递的参数的本身(实参)是不能被修改的!参数x传进去的时候会被复制了一份copy,此后的修改都是在临时变量copy上,出了函数体copy被销毁,x还是原来的x,根本就没有被修改过,所以对变量x的修改无效。

如果想要修改传入的参数,有两种方法:

传地址,传入x的地址,也就是将指向x的指针作为参数进行传递,【指针参数传递本质上是值传递,它所传递的是一个地址值】int f(int *x); f(&x); 指针传进去被复制了一份copy,x的指针的copy指向的内容也是x,对指针的copy的修改也就是修改了x的内容。 对于①来讲,在函数中如果传递的是指针,那么只能修改指针指向的内容,不能修改指针本身;如果想要修改指针本身,要么在再加一级指针,要么用引用&。

引用传参 ,引用传参往往要比值传参高效,因为它是直接将x作为参数传入进去,而少了对x进行复制这部分的开销,既然传入进去的是x,那么对x的修改肯定也生效。

2.引用方式传参

引用可以被理解为变量的一个别名,但这依旧是原变量,如果在函数内对该变量进行修改的话,在外部该变量也会相应被修改。一定要先有原变量,才能有原变量的别名,故引用一定要赋初值,写成int &a=一个已存在的值的形式。

int a=11; int &b=a; b=9 在这时输出a的值发现a=9。

【比如:我的名字叫王**,**别名叫王哥,我在函数里传入的参数为王哥,在函数内部我修改了王哥的体重,那么在调用函数时,王****的体重也被修改了。】

引用声明后使用方式和原变量一样(用指针的话要加一个取值的操作)

**

3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用

**

函数传递的是指针变量的值——即该指针所指向的变量的地址,只能改变指针所指向变量的值,而不能改变指针本身的值

#include<cstdio>
#include<stdlib.h>
typedef struct LNode
{
   
int data;struct LNode *next;
}LNode,*LinkList;
void CreateList(LNode *header)
{
   
        header=(LNode*)malloc(sizeof(LNode));
        header->data=11;                
        header->next=NULL;
}
int main()
{
   
        LinkList head=NULL;
        CreateList(head);        
        if(head!=NULL)        
        printf("%d\n",head->data);//什么都没有输出 
         free(head);        
    return 0;
 }

②传递指针的地址,便可以修改指针本身的内容

#include<cstdio>
#include<stdlib.h>
typedef struct LNode
{
   
int data;
struct LNode *next;
}LNode,*LinkList;//初始化链表,函数调用完毕后,L会指向一个空的链表,即会改变指针的值,所以要用**header
//**header不仅能修改指针所指向变量的值,也能够修改指针本身的内容 
void CreateList(LNode **header)
{
   
 //(LinkList *header) 
 (*header)=(LNode*)malloc(sizeof(LNode));
 //(LinkList)malloc(sizeof(LNode));        
 (*header)->data=11;        
 (*header)->next=NULL;
 }
 int main()
 {
   
         LinkList head=NULL;
         CreateList(&head);
         //传递指针本身的地址 
         if(head!=NULL)
         {
   
         printf("%d\n",head->data);//11
         }
         free(head);
         return 0;
}

③(LinkList
&header)这里的header其实是传入指针head的别名

#include<cstdio>
#include<stdlib.h>
typedef struct LNode{
   
int data;
struct LNode *next;
}LNode,*LinkList;
//header其实是传入指针head的别名
void CreateList(LinkList &header){
    //参数也可写成(LNode *&header)
 header=(LNode*)malloc(sizeof(LNode));//(LinkList)malloc(sizeof(LNode));
        header->data=11;
        header->next=NULL;
}
int main(){
   
        LinkList head=NULL;
        CreateList(head); 
if(head!=NULL){
   
printf("%d\n",head->data);//11 
        }
free(head);
return 0;
}

4.总结

其实指针类型和基本类型(比如int)来说,并没有本质上的差别。示例 :int x;LNode *L; (LNode为结构体)

·
在传值方式传参时,对于基本类型:函数参数为int x,调用函数传入x;对于指针:函数参数为LNode *,调用函数时传入L

·
在地址传递时,对于基本类型:函数参数为int
*x,调用函数传入&x;对于指针:函数参数为LNode
**,调用函数时传入&L。

·
在引用方式传参,对于基本类型:函数参数为int
&x,调用函数传入x;对于指针:函数参数为LNode*
&L(或LinkList &L ),调用函数时传入&L。

当你传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值; 当你传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,即可以改变指针所指的内容,又可以改变指针本身

→补充注意点:

①在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。

②C语言中实

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值