C语言的指针传递和C++的引用传递

首先,C语言没有引用传递。

C++中使用引用传递的方式是在函数的参数前加&号,如:

void Delete_X(LinkList &L, ElemType x)    // 声明

Delete_X(L, 45);    // 使用

C:指针作为参数传入函数中时,是值传递

      示例代码:

#include <stdio.h>

void fun(int *a)
{
	int t = 50;
	a = &t;
	printf("infun:a=%p\t*a=%d\n", a, *a);
}

int main()
{
	int b=10;
	int *a=&b;
	printf("out1:a=%p\t*a=%d\n", a, *a);
	fun(a);
	printf("out2:a=%p\t*a=%d\n", a, *a);
	return 0;
}

    示例结果:

可以看出,指针作为参数传入函数时,只是将指针变量中存储的地址值传入函数,在函数内改变了形参的地址值并不会对函数外的指针产生影响。图解如下:

注意:虽然在函数中改变地址不会对a产生影响,但是修改*a,外部*a的值也会变化,因为函数内部和外部的指针a,a'都指向b,所以只要修改*a就是修改b的值。

 

C++引用&和上述的指针传递不同,引用传递相当于把变量本身传入函数,而不是新建一个形参接收a的值。所以在函数内外对a进行操作,结果是一致的。

比如上述代码只改动一处:void fun(int* &a)   

结果如下图:

 

 

上述原理明白后,举个复杂的例子:

王道数据库的书中有这样一道题:设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。

算法的思想:设 f ( L , x ) 的功能是删除以L为首结点指针的单链表中所有值等于 x 的结点,显然有 f ( L -> next , x ) 的功能是删除以 L -> next 为首结点指针的单链表中所有值等于 x 的结点。

void Delete_X(LinkList &L, ElemType x)
{
	LNode *p;
	if(L==NULL)
		return;
	if(L->data==x)
	{
		p = L;
		L = L->next;
		free(p);
		Delete_X(L, x);
	}
	else
		Delete_X(L->next, x);
}

在C++中使用引用传递,这样的做法是没有问题的。但是在C中使用指针作为参数进行传递就会有问题,因为在删除结点的时候,让L=L->next在函数中修改了L的地址,但是函数外的L地址值没有改变,也就是并没有成功建立删除头结点后的链接,此时free(p)就会造成断链。图示如下:

 

 

如果想用C来实现这个代码,可以将传入函数的参数改为指针的指针,代码如下:

void Delete_X(LinkList *L1, ElemType x)
{
	if(*L1==NULL)
		return;
	LNode *p;
	if((*L1)->data==x)
	{
		p = *L1;
		*L1 = (*L1)->next;
		free(p);
		Delete_X(&(*L1), x);
	}
	else
		Delete_X(&((*L1)->next), x);
}

L1->L,将L1传入函数,根据之前的推断,函数内部会构造一个形参L1',L1的值不会受到函数内部的影响。但是在函数内修改L1所指向的L的值,其L值的变化也应用于函数外(因为L1和L1'指向的是同一块内存区域,对这个区域的修改自然不区分函数的内部和外部)。

注意:C这段函数代码不能写   LinkList L = *L1;   让L来代替*L1的写法,看似书写变得简洁,其实相当于还是构造了一个L的形参,对这个形参的修改不会作用到函数外的L上。

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言C++语言在引用传递方面有一些区别。在C语言中,没有直接支持引用传递的语法,而是通过指针传递来实现类似的功能。而在C++语言中,引入了引用传递的概念,可以更方便地进行变量的传递和操作[^1]。 C语言中的指针传递是通过将变量的地址传递给函数来实现的。在函数内部,可以通过指针来访问和修改原始变量的值。但是需要注意的是,在函数内部修改指针的值并不会影响到原始变量的地址。因此,如果想要修改原始变量的地址,需要传递指向指针指针或者使用返回值来实现。 而在C++语言中,引用传递使用`&`符号来声明。通过引用传递,可以直接将变量本身传递给函数,而不是传递变量的地址。这样,在函数内部对变量的修改会直接影响到原始变量的值。这种方式更加直观和方便,可以避免使用指针的复杂性和可能的错误。 下面是一个示例,演示了C语言C++语言中引用传递的区别: C语言中的指针传递: ```c #include <stdio.h> void changeValue(int *ptr) { *ptr = 100; } int main() { int num = 10; printf("Before change: %d\n", num); changeValue(&num); printf("After change: %d\n", num); return 0; } ``` C++语言中的引用传递: ```cpp #include <iostream> void changeValue(int &ref) { ref = 100; } int main() { int num = 10; std::cout << "Before change: " << num << std::endl; changeValue(num); std::cout << "After change: " << num << std::endl; return 0; } ``` 运行以上代码,可以看到C语言中使用指针传递C++语言中使用引用传递的结果是一致的,都将变量的值修改为100。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值