C语言之指针函数

函数参数

普通变量作为函数的参数

代码示例

#include <stdio.h>
// 声明函数
void ChangeNumValue(int a) {
    a = 10000;
}
int main() {

    // 定义变量
    int num = 10;
    // 调用函数
    ChangeNumValue(num);
    printf("num = %d\n", num);
    return 0;
}

图示

程序运行结果

num = 10

指针变量作为函数的形参

代码示例

#include <stdio.h>

// 声明函数
void ChangeNumValue(int *p) {
    *p = 10000;
}

int main() {

    // 定义变量
    int num = 10;
    // 调用函数
    ChangeNumValue(&num);
    printf("num = %d\n", 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\n", 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("\n");
}

//定义一个函数给arr元素获取键盘输入
void InputIntArray(int *arr, int n)
{
    printf("请输入%d个int数据\n",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\n", sizeof(arr));//数组的总大小 20

    // 调用函数
    InputIntArray(arr, n);

    int max = 0;
    //调用函数
    MaxInt(arr,n, &max);
    printf("max = %d\n", 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\n", 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\n", a, b);

	return 0;
}

通过被调函数修改主调函数的值

1.实参必须是该普通变量的地址。
2.形参必须是指针变量。
3.在被调中通过*形参名的方式就可以修改主调函数相关变量的值。

猜你喜欢

转载自www.cnblogs.com/Guard9/p/12905153.html