在 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指针,即传递多维数组的指针,传递自引用结构的指针等等,这些在不同的应用领域,如复杂数据结构、硬件控制编程等,都有着重要的用途。

