Linux C 编程教程第 8 部分 - 按值调用与按指针/地址调用Linux C 编程教程第 8 部分 - 按值调用与按指针/地址调用Linux C 编程教程第 8 部分 - 按值调用与按指针/地址调用Linux C 编程教程第 8 部分 - 按值调用与按指针/地址调用
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux C 编程教程第 8 部分 - 按值调用与按指针/地址调用

在这个正在进行的教程系列的第一部分中,我们简要讨论了函数,包括它们的声明和函数体。我们当时没有讨论的是函数调用的多种方式。在本教程中,我们将快速讨论存在的方式。

在 C 语言中,您可以通过两种方式调用函数:按值调用和按指针或地址调用。让我们用一些易于理解的例子来讨论这两个概念。

假设您想编写一个交换两个值的程序。你可以这样做:

#include <stdio.h>

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

c = a;
a = b;
b = c;

printf("\nSwapped values are: %d and %d", a,b);



return 0;
}

下面是输入值为 5 和 9 的代码的输出:

Enter two integer values
5 9

Entered values are: 5 and 9
Swapped values are: 9 and 5

现在,假设要求有一个单独的函数——比如交换——它完成所有与交换相关的工作,并且可以在程序员想要交换两个值时调用。以下是执行此操作的代码:

#include <stdio.h>

void swap (int val1, int val2)
{
int temp = 0;

temp = val1;
val1 = val2;
val2 = temp;

printf("\nSwapped values are: %d and %d", val1,val2);

}

int main()
{
int a=0, b=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(a,b);

return 0;
}

所以你去吧。已创建一个名为 swap 的单独函数,它接收两个值(最初由用户输入并在 main 函数中捕获)作为参数,然后交换它们并打印输出。

此处调用交换的方式称为按值调用。原因是,在进行调用时,只有 a 和 b 持有的值作为参数传递给交换函数。这些值由参数 val1 和 val2 及其执行交换过程的这些变量接收。

这意味着即使在执行交换操作后,main 函数中的变量 a 和 b 仍继续保持原始值。但是,如果要求在调用 swap 函数后交换 a 和 b 的值怎么办?好吧,这就是通过指针/地址方法进行调用的地方。

所以基本上我们在这里做的是,我们将变量的地址(如我们的例子中的 a 和 b)作为参数传递。被调用的函数(在本例中为 swap)能够接收地址作为参数,然后对保存在这些地址中的值进行交换过程,这实际上意味着原始变量(此处为 a 和 b)的值被交换。

现在,在上一段中,我们说函数“配备接收地址作为参数”。那么,所谓“配备”,我们的意思是它具有可以接收地址的特殊类型的参数。这些参数是指针类型变量。我们将在接下来的教程中详细讨论指针,但现在,请记住指针变量将内存地址存储为值。

下面是指向整数的指针是如何声明/定义的:

int *x;

所以基本上,x 是一个指针变量,可用于存储整数变量的内存地址。假设 i 是一个整型变量,那么下面是让 x 存储 i 的地址的方法:

x = &i;

每当你想通过 x 访问 i 的值时,你就写 *x。例如,下面是如何将 i 的值更改为 10 的方法:

*x = 10;

因此,考虑到所有这些,下面是如何使用地址调用或指针方法调用交换:

#include <stdio.h>

void swap (int *val1, int *val2)
{
int temp = 0;

temp = *val1;
*val1 = *val2;
*val2 = temp;

}

int main()
{
int a=0, b=0, c=0;

printf("Enter two integer values\n");

scanf("%d %d",&a,&b);

printf("Entered values are: %d and %d", a,b);

swap(&a,&b);

printf("\nSwapped values are: %d and %d", a,b);


return 0;
}

所以这一次,我们没有将 a 和 b 的值作为参数传递,而是传递了这些变量的地址。在 swap 函数中,地址在两个指针变量(val1 和 val2)中接收。并使用两个指针变量,逻辑直接交换 a 和 b 的值。

继承人的输出:

Enter two integer values 
6 8
Entered values are: 6 and 8
Swapped values are: 8 and 6

本文至少应该让您大致了解什么是按值调用和按地址/指针调用函数调用方式,以及何时可以使用它们。尝试我们在此处列出的示例,如果您有任何疑问或疑问,请在下面的评论中告诉我们。

©2015-2025 艾丽卡 support@alaica.com