【C语言】指针进阶之传值调用与传址调用

简介: 【C语言】指针进阶之传值调用与传址调用

1.前言

学习指针的⽬的是使⽤指针解决问题,那什么问题,⾮指针不可呢?

✔在编程语言如C中,传值调用和传址调用是用来传递参数给函数的方法。它们的主要区别在于参数传递的方式:

传值调用:这是最基本的参数传递方式,它涉及将参数的值复制一份传递给函数。在函数内部,对这些复制的值进行的任何修改都不会影响到原参数的值,因为函数只是在自己的局部范围内操作这个副本。

传址调用:这种方式则是将参数的地址传递给函数。这样做的目的是让函数能够直接访问到传入的参数,并且可以对这些地址指向的数据进行修改

2.传值调用举例说明


#include <stdio.h>
 
void Swap1(int x, int y)
 
{
 
 int tmp = x;
 
 x = y;
 
 y = tmp;
 
}
 
int main()
 
{
 
 int a = 0;
 
 int b = 0;
 
 scanf("%d %d", &a, &b);
 
 printf("交换前:a=%d b=%d\n", a, b);
 
 Swap1(a, b);
 
 printf("交换后:a=%d b=%d\n", a, b);
 
 return 0;
 
}

当我们运⾏代码,结果如下:

我们发现其实没产⽣交换的效果,这是为什么呢?

这是因为Swap1函数在使⽤的时候,是把变量本⾝直接传递给了函数,在Swap1函数内部交换x和y的值,⾃然不会影响a和b,当Swap1函数调⽤结束后回到main函数,a和b的没法交换。这种调⽤函数的⽅式我们之前在函数的时候就知道了,这种叫传值调⽤

结论:实参传递给形参的时候,形参会单独创建⼀份临时空间来接收实参,对形参的修改不影响实

参。

所以Swap是失败的了。

那怎么办呢?

3.传址调用的举例说明


#include <stdio.h>
void Swap2(int*px, int*py)
 
{
 
 int tmp = 0;
 
 tmp = *px;
 
 *px = *py;
 
 *py = tmp;
 
}
 
int main()
 
{
 
 int a = 0;
 
 int b = 0;
 
 scanf("%d %d", &a, &b);
 
 printf("交换前:a=%d b=%d\n", a, b);
 
 Swap1(&a, &b);
 
 printf("交换后:a=%d b=%d\n", a, b);
 
 return 0;
 
}

⾸先看输出结果:

我们可以看到实现成Swap2的⽅式,顺利完成了任务,这⾥调⽤Swap2函数的时候是将变量的地址传递给了函数,这种函数调⽤⽅式叫:传址调⽤

✔传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;

4.结论

所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。

相关文章
|
13天前
|
安全 C语言
【C语言】如何规避野指针
【C语言】如何规避野指针
20 0
|
14天前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
3天前
|
C语言
c语言指针总结
c语言指针总结
10 1
|
3天前
|
搜索推荐 C语言
详解指针进阶2
详解指针进阶2
|
8天前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
10天前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
9 2
|
13天前
|
存储 编译器 C语言
【C语言】初步解决指针疑惑
【C语言】初步解决指针疑惑
7 0
|
14天前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针
|
14天前
|
C语言 C++
C语言:指针运算笔试题解析(包括令人费解的指针题目)
C语言:指针运算笔试题解析(包括令人费解的指针题目)