自学内容网 自学内容网

C++与C中,由函数形参test(int *&a)引出的问题

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


原文地址:https://blog.csdn.net/w5875895/article/details/140494505

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!