文章参考来源:
 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)**相当于引用,在操作时,改变的是地址的值;
 



















