• C语言之指针函数


    函数参数

    普通变量作为函数的参数

    代码示例

    #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.在被调中通过*形参名的方式就可以修改主调函数相关变量的值。
    
  • 相关阅读:
    【PAT甲级】1063 Set Similarity (25 分)
    【PAT甲级】1062 Talent and Virtue (25 分)
    【PAT甲级】1061 Dating (20 分)
    Codeforces Global Round 5E(构造,思维)
    Codeforces Round #592 (Div. 2)G(模拟)
    POJ 刷题进程.1
    登录页面 (带遮罩层的) ---2017-04--5
    回答: 2017-03-19的关于css+div布局的疑问 2017-04-05
    关于js高度和宽度的获取 ----2017-03-29
    如何用写js弹出层 ----2017-03-29
  • 原文地址:https://www.cnblogs.com/Guard9/p/12905153.html
Copyright © 2020-2023  润新知