函数参数
普通变量作为函数的参数
代码示例
#include <stdio.h>
// 声明函数
void ChangeNumValue(int a) {
a = 10000;
}
int main() {
// 定义变量
int num = 10;
// 调用函数
ChangeNumValue(num);
printf("num = %d
", num);
return 0;
}
图示
程序运行结果
num = 10
指针变量作为函数的形参
代码示例
#include <stdio.h>
// 声明函数
void ChangeNumValue(int *p) {
*p = 10000;
}
int main() {
// 定义变量
int num = 10;
// 调用函数
ChangeNumValue(&num);
printf("num = %d
", num);
return 0;
}
程序运行结果
num = 10000
图示
重点:
如果想在函数内部修改外部变量的值,请传外部变量的地址。
经典案例
互换数字
# include <stdio.h>
void swap1(int , int);
void swap2(int *, int *);
void swap3(int *, int *);
int main(void)
{
int a = 3;
int b = 5;
huhuan_3(&a, &b); //swap2(*p, *q); 是错误的, swap2(a, b);也是错误的
printf("a = %d, b = %d
", a, b);
return 0;
}
//不能完成互换功能
void swap1(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
//不能完成互换功能
void swap2(int * p, int * q)
{
int * t;//如果要互换p和q的值,则t必须是int *,不能是int,否则会出错
t = p;
p = q;
q = t;
}
//可以完成互换功能
void swap3(int * p, int * q)
{
int t; //如果要互换*p和*q的值, 则t必须定义成int,不能定义成int *, 否则语法出错
t = *p; //p是int *, *p是int
*p = *q;
*q = t;
}
数组名作为函数的参数
代码示例
#include <stdio.h>
#include <ntdef.h>
// 声明函数
void PrintIntArray(int *arr, int n)
{
// 遍历数组
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);//arr[i] == *(arr+i)
}
printf("
");
}
//定义一个函数给arr元素获取键盘输入
void InputIntArray(int *arr, int n)
{
printf("请输入%d个int数据
",n);
for (int i = 0; i < n; i++)
{
scanf("%d", arr+i);//&arr[i] == &*(arr+i) == arr+i
}
}
//定义一个函数 求出arr数组的最大值
void MaxInt(int *arr, int n, int *p_max)//p_max = &max
{
int tmp_max = arr[0];
for (size_t i = 0; i < n; i++)
{
if (tmp_max < arr[i])
{
tmp_max = arr[i];
}
}
//将tmp_max值 通过p_max 间接赋值给外部变量max
//*p_max == max
*p_max = tmp_max;//max = tmp_max
}
int main() {
// 定义数组
int arr[5] = {1,2,3,4,8};
int n = sizeof(arr) / sizeof(arr[0]);
printf("数组的总大小n=%d
", sizeof(arr));//数组的总大小 20
// 调用函数
InputIntArray(arr, n);
int max = 0;
//调用函数
MaxInt(arr,n, &max);
printf("max = %d
", max);
// 调用函数
PrintIntArray(arr, n); //函数内部 操作(读/写)外部数组元素,请将外部数组名传递给函数的形参
return 0;
}
程序运行结果
数组的总大小n=20
请输入5个int数据
8
9
44
33
30
max = 44
8 9 44 33 30
*号的三种含义
-
乘法
-
定义指针变量。Int * p,定义了一个名字叫p的变量,int *表示p只能存放int变量的地址。
-
指针运算符。该运算符是放在已经定义好的指针变量的前面。如果p是一个已经定义好的指针变量,则*P表示以p的内容为地址的变量。注意理解形参,实参,和局部变量的关系。
基本类型指针
# include <stdio.h>
int main(void)
{
int * p;//等价于 int *p; 也等价于 int* p;
int i = 5;
char ch = 'A';
p = &i; // *p 以p的内容为地址的变量
*p = 99;
printf("i = %d, *p = %d
", i, *p);
//p = &ch;
//p = ch; //error
//p = 5; //error
return 0;
}
程序运行结果
i=99 *p=99
函数类型指针
指针可以是函数返回一个以上的值
# include <stdio.h>
void swap1(int i, int j)
{
int t;
t = i; i = j; j = t;
}
void swap2(int * p, int * q)
{
int * t;
t = p; p = q; q = t;
}
void swap3(int * p, int * q) //形参名字是p和q,接收实参数据的是p和q,而不是*p和*q
{
int t;
t = *p; *p = *q; *q = t;
}
int main(void)
{
int a = 3;
int b = 5;
swap_3(&a, &b);
printf("a = %d, b = %d
", a, b);
return 0;
}
通过被调函数修改主调函数的值
1.实参必须是该普通变量的地址。
2.形参必须是指针变量。
3.在被调中通过*形参名的方式就可以修改主调函数相关变量的值。