文章参考来源:
1.c函数中形参为引用的情况;C++中a和&a的区别
描述:
最近在看循环单链表时,看到有篇文章中,链表初始化函数为图下,我在想,这个函数形参(类似 "int * & a"一样)到底是指针的引用还是?
typedef struct node{
int data;
struct node *next;
}Node,*LinkList;
//初始化(头插法)
bool InitList(LinkList &L)
{.......}
然后我打印地址看出地址相同,即“int *& a”为 指针的引用,同时,对于函数新参引用(值、址以及引用传递),只有地址传递和引用会改变实参的值。C编译出错,C++可以编译,貌似这种写法只能在C++中使用么?见下文引申
int main()
{
int x = 6;
LinkList L;
printf("函数外L地址为:%p\r\n",&L);
InitList(L);
InsertNode(L,x);
travel(L);
return 0;
}
引申:C++ 环境下,对指针的传递方式进行验证;如果要在C中实现,则要使用指针的指针
void foo(int* ptr); //传值调用
int a;
int* pValue = &a;
foo(pValue);
其中,pValue的值不能被函数foo改变的,即pValue指向a
/*在C中实现*/
void foo(int** pptr)
{
*ptr = NULL;
}
调用时要foo(&pValue)
#include <stdio.h>
void too (int * a)
{
int b =1;
a = &b;
}
void too2 (int*& a)
{
int p =7;
a = &p;
// a =NULL;
}
int main()
{
int a = 4;
int *p = &a;
printf("前p的值为%d\r\n",*p);
too(p);
printf("中p的值为%d\r\n",*p);
too2(p);
printf("后p的值为%d\r\n",*p);
return 0;
}
补充:注:如果形参为指针(LinkList L)则InitList(LinkList L) 实际就传入的只有值,类似值传递,在该函数内只是新建了一个临时空间存储L的值,并进行操作,不会改变L实际的值,而**InitList(LinkList &L)**相当于引用,在操作时,改变的是地址的值;