C语言指针传参与C++引用传参,以及尾插法建立单链表使用到的引用
先用传入数组做参
#include <stdio.h>
void sum(int *j){
int i=0;
while(i<4){
j[0]+=j[i++];
}
}
int main()
{
int j[]={1,2,3,4};
sum(j);
printf("j[0] in main is %d\n",j[0]);
return(0);
}
输出:j[0] in main is 11
C中数组名就是指针,C中子函数用指针传参时,子函数会直接操作原值,而整形变量就不行,整形变量就不举例子了,看下面的如何用指针传参来改变原值
变量的指针传参
#include <stdio.h>
void sum(int *a,int *b){
*a=33,*b=65;
printf("\nIn sum,a= %d",*a);
printf("\nIn sum,b= %d",*b);
}
int main()
{
int a=32,b=64;
int *pa,*pb;
pa=&a;
pb=&b;
printf("\nIn main,before sum,a= %d",a);
printf("\nIn main,before sum,b= %d",b);
sum (pa,pb);
printf("\nIn main,after sum,a= %d",a);
printf("\nIn main,after sum,b= %d",b);
}
在sum函数中,需要用*a来操作原值(主函数的a),运行结果是
In main,before sum,a= 32
In main,before sum,b= 64
In sum,a= 33
In sum,b= 65
In main,after sum,a= 33
In main,after sum,b= 65
在gcc编译时,也就是用C语言编写时,定义sum时,只能用指针,不能用引用。用引用会报错。网上好多讲c语言引用传参的,坑死了
用g++编译时,才能用引用传参,也就是说C++才支持引用传递,C语言不支持!
引用传参具体怎么用呢?请看下面的例子,add函数是引用传参,调用时,直接把变量名传进去。add函数会直接操作原值,不会在内部拷贝一份
#include <stdio.h>
int add(int &x,int &y);
int main()
{
int a=3,b=5;
int sum=add(a,b);
printf("sum=%d\n",sum);
return 0;
}
int add(int &x,int &y)
{
x=x+1;
y=y+1;
return x+y;
}
sum=10
用尾插法建立单链表,并输出。
王道书的代码, 主要代码是C,但用到了C++的引用传参,需要用g++编译
#include <stdio.h>
#include <cstdlib>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList; //LNode指示单个的节点,LinkList指示链表
void List_TailInsert(LinkList &L){
int x;
L=(LinkList)malloc(sizeof(LNode));
LNode *s,*r=L; //r为表尾指针
scanf("%d",&x); //输入结点的值
while(x!=9999){ //输入9999表示结束
s=(LNode *)malloc(sizeof(LNode));
s->data=x;
r->next=s;
r=s; //r指向新的表尾结点
scanf("%d",&x);
}
r->next=NULL;
//return L;
}
void show(LinkList &L){
LNode *p=L->next;
int i=0;
while(p!=NULL){
printf("%d\n",p->data);
p=p->next;
}
}
int main()
{
LinkList L1;
List_TailInsert(L1);
show(L1);
}
PS E:\data-structure\新建文件夹> g++ .\3.尾插法使用引用.c
PS E:\data-structure\新建文件夹> .\a.exe
1
2
3
4
9999
1
2
3
4