- C 编程教程
- C - 首页
- C 基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C 中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C 中的操作符
- C - 操作符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof 运算符
- C - 运算符优先级
- C - 其他运算符
- C 中的决策
- C - 决策
- C - if 语句
- C - if...else 语句
- C - 嵌套 if 语句
- C - switch 语句
- C - 嵌套 switch 语句
- C 中的循环
- C - 循环
- C - while 循环
- C - for 循环
- C - do...while 循环
- C - 嵌套循环
- C - 无限循环
- C - break 语句
- C - continue 语句
- C - goto 语句
- C 中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C 中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C 中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 可变长数组
- C 中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - 空指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C 中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C 结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点 (.) 运算符
- C - 枚举 (或 enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C 中的文件处理
- C - 输入和输出
- C - 文件 I/O(文件处理)
- C 预处理器
- C - 预处理器
- C - 预处理程序指令
- C - 预处理器操作符
- C - 宏
- C - 头文件
- C 中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static 关键字
- C - 随机数生成
- C - 命令行参数
- C 编程资源
- C - 问题与解答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
在 C 中将指针传递给函数
在 C 中,指针是一个存储另一个变量地址的变量。它充当对原始变量的引用。指针可以像传递任何其他参数一样传递给函数。
C 中的函数可以通过两种方式调用:
要按引用调用函数,您需要将其定义为接收调用函数中变量的指针。以下是您将用于按引用调用函数的语法:
type function_name(type *var1, type *var2, ...)
当按引用调用函数时,会传递实际参数变量的指针,而不是它们的值。
将指针传递给函数的优点
将指针传递给函数有两个优点:
- 它克服了按值传递的限制。对被调用函数内部值所做的更改会直接在指针中存储的地址处完成。因此,我们可以从另一个作用域操作一个作用域中的变量。
- 它还克服了函数只能返回一个表达式的限制。通过传递指针,函数处理的效果直接发生在地址处。其次,如果我们返回数组或结构体变量的指针,则可以返回多个值。
在本章中,我们将了解如何:
- 将指针传递给 int 变量
- 将指针传递给数组
- 将指针传递给结构体
将指针传递给函数的示例
让我们定义一个函数add(),它接收两个变量的引用。当调用此类函数时,我们传递实际参数的地址。让我们从main() 函数内部按引用调用 add() 函数。
#include <stdio.h> /* function declaration */ 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
通过传递指针交换值
将指针传递给函数的最常被引用的应用之一是如何交换两个变量的值。
以下函数接收要交换值的两个变量的引用:
/* function definition to swap the values */ int swap(int *x, int *y){ int z; z = *x; /* save the value at address x */ *x = *y; /* put y into x */ *y = z; /* put z into 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 (){ /* local variable definition */ int a = 10; int b = 20; printf("Before swap, value of a: %d\n", a); printf("Before swap, value of b: %d\n", b); /* calling a function to swap the values */ swap(&a, &b); printf("After swap, value of a: %d\n", a); printf("After swap, value of b: %d\n", 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\n", x, arr[0]); printf("Cube of %d: %f\n", x, arr[1]); printf("Square root of %d: %f\n", 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元素 r→area。
#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 \n Breadth: %f \n Area: %lf\n", 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
将指针传递给函数的概念的逻辑扩展导致传递联合体指针,即多维数组的指针,传递自引用结构体的指针等,所有这些在不同的应用领域(如复杂数据结构、硬件控制编程等)中都有重要的用途。