在 C 语言中将指针传递给函数
C 语言中的指针是一个存储另一个变量地址的变量。它充当对原始变量的引用。指针可以传递给函数,就像传递任何其他参数一样。
C 语言中的函数可以通过两种方式调用 -
要通过引用调用函数,您需要将其定义为接收指向调用函数中变量的指针。以下是通过引用调用函数的语法 -
type function_name(type *var1, type *var2, ...)
通过引用调用函数时,传递的是实际参数变量的指针,而不是它们的值。
将指针传递给函数的优点
将指针传递给函数有两个优点 -
- 它克服了按值传递的局限性。对被调用函数内部值的更改直接在指针中存储的地址进行。因此,我们可以从一个作用域操作另一个作用域中的变量。
- 它还克服了函数只能返回一个表达式的限制。通过传递指针,函数的处理效果直接在地址上进行。其次,如果我们返回一个数组或结构体变量的指针,则可以返回多个值。
在本章中,我们将了解如何:
- 将指针传递给 int 变量
- 将指针传递给数组
- 将指针传递给结构体
将指针传递给函数的示例
定义一个函数 add(),它接收两个变量的引用。调用该函数时,我们传递实际参数的地址。让我们从main() 函数内部通过引用调用 add() 函数。
#include <stdio.h> /* 函数声明 */ int add(int *, int *); int main(){ int a = 10, b = 20; int c = add(&a, &b); printf("Addition: %d", c); } int add(int *x, int *y){ int z = *x + *y; return z; }
输出
Addition: 30
通过传递指针交换值
将指针传递给函数的最常见应用之一是交换两个变量的值。
以下函数接收两个待交换值的变量的引用 -
/* 函数定义,用于交换值 */ int swap(int *x, int *y){ int z; z = *x; /* 将值保存在地址 x */ *x = *y; /* 将 y 赋值给 x */ *y = z; /* 将 z 赋值给 y */ return 0; }
示例
main() 函数有两个变量 a 和 b;它们的地址作为参数传递给 swap() 函数。
#include <stdio.h> int swap(int *x, int *y){ int z; z = *x; *x = *y; *y = z; } int main (){ /* 局部变量定义 */ int a = 10; int b = 20; printf("Before swap, value of a: %d ", a); printf("Before swap, value of b: %d ", b); /* calling a function to swap the values */ swap(&a, &b); printf("After swap, value of a: %d ", a); printf("After swap, value of b: %d ", b); return 0; }
输出
当您执行此代码时,它将产生以下输出 -
Before swap, value of a: 10 Before swap, value of b: 20 After swap, value of a: 20 After swap, value of b: 10
将数组指针传递给函数
在 C 语言编程中,数组名称充当数组首元素的地址;换句话说,它变成了指向数组的指针。
示例
在此示例中,我们在 main() 函数中声明一个未初始化的数组,并将其指针与一个整数一起传递给函数。
在函数内部,数组将填充所传递整数的平方、立方和平方根。函数返回该数组的指针,main() 函数将使用该指针访问并打印数组中的值。
#include <stdio.h> #include <math.h> int arrfunction(int, float *); int main(){ int x = 100; float arr[3]; arrfunction(x, arr); printf("Square of %d: %f ", x, arr[0]); printf("Cube of %d: %f ", x, arr[1]); printf("Square root of %d: %f ", x, arr[2]); return 0; } int arrfunction(int x, float *arr){ arr[0] = pow(x,2); arr[1] = pow(x, 3); arr[2] = pow(x, 0.5); }
输出
运行此代码时,将产生以下输出 -
Square of 100: 10000.000000 cube of 100: 1000000.000000 Square root of 100: 10.000000
将字符串指针传递给函数
我们来看另一个示例,其中我们将字符串指针传递给函数。
示例
在此程序中,两个字符串被传递给 compare() 函数。在 C 语言中,字符串是一个 char 数据类型的数组。我们使用 strlen() 函数来查找字符串的长度。
#include <stdio.h> int compare(char *, char *); int main(){ char str1[] = "BAT"; char str2[] = "BALL"; int ret = compare(str1, str2); return 0; } int compare (char *x, char *y){ int val; if (strlen(x) > strlen(y)){ printf("Length of Str1 is greater than or equal to the length of Str2"); } else{ printf("Length of Str1 is less than the length of Str2"); } }
输出
运行此代码时,将产生以下输出 -
Length of Str1 is less than the length of Str2
将结构体指针传递给函数
在 C 语言编程中,结构体是一种异构数据类型,包含不同数据类型的元素。让我们看看如何将结构体指针传递给函数。
示例
在此示例中,在 main() 函数中声明了一个结构体变量 rectangle,并将其地址传递给名为 area() 的用户定义函数。调用 area() 函数时,可以使用间接寻址运算符""来使用该变量的元素。它会计算结果并将其赋值给 area 元素 rarea。
#include <stdio.h> #include <string.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle *); int main(){ struct rectangle s; printf("Input length and breadth of a rectangle"); scanf("%f %f", &s.len, &s.brd); area(&s); return 0; } int area(struct rectangle *r){ r->area = (double)(r->len*r->brd); printf("Length: %f Breadth: %f Area: %lf ", r->len, r->brd, r->area); return 0; }
输出
运行代码并检查其输出 −
Input length and breadth of a rectangle 10.5 20.5 Length: 10.500000 Breadth: 20.500000 Area: 215.250000
将将指针传递给函数的概念进行逻辑扩展,可以传递Union指针,即传递多维数组的指针,传递自引用结构的指针等等,这些在不同的应用领域,如复杂数据结构、硬件控制编程等,都有着重要的用途。