零基础C语言:第十讲(参数与指针、指针函数、函数指针)

183 阅读3分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

参数与指针

  • 形参与实参

    • 形参:形式参数(只有在函数内部有效,调用之前不分配内存,调用结束回收内存)
    • 实参:实际划分内存
    • 实参可以传值给形参,但形参不能传值给实参
  • 传值和传址

    • 不使用指针交换两个变量的值(传值)

      • 代码
      • 结果
    • 使用指针交换两个变量的值(传址)

      • 代码
      • 结果
  • 传数组

    • 举例
    • 结果
    • 注意

      • 在64位操作系统中,指针占8个字节
  • 可变参数

    • 要引用库#include<stdarg.h>

      • va_list:定义参数列表
      • va_start:宏定义
      • va_arg:获取参数
      • va_end:关闭参数列表
    • 举例
    • 结果
  • 指针函数

    • 举例
    • 结果
    • 注意:想要调用函数返回字符串,但是C语言没有字符串类型,所以通常使用char类型的指针来定义字符串。(因为char类型的指针指向一个字符的地址,使用该类型指向字符串的第一个字符地址,字符串约定截止为空字符‘\0’,所以知道第一个字符就知道了整个字符串,这是由字符串的性质决定的。)
    • 不要返回局部变量的指针

      • 举例
      • 结果:无法返回结果(因为返回的是局部变量,但是返回之后该地址自动销毁,故无法返回局部变量的指针)
    • 为什么可以直接返回字符串常量:因为字符串是常量,存储区域不是局部\

指针函数和函数指针

  • 函数指针

    • 指针函数:int *p();
    • 函数指针:int (*p)();
    • 举例
    • 结果
    • 注意:理解为函数名=数组名=首地址,这里将fp赋值为square的地址,*fp则代表这个函数。类似于数组
  • 函数指针作为参数

    • 举例
    • 结果
    • 注意:第一个参数是指针,这个指针指向一个函数,且该函数需要符合的条件:有两个参数且都为整形,返回值也为整形
  • 函数指针作为返回值

    • 比如这个函数的名字叫select,它本身有两个参数,返回返回值是一个函数指针,这函数指针也有两个参数,并且其返回值为整型。
    • 现在让用户输入一个表达式,然后程序根据用户输入的运算符来决定调用add还是sub函数进行运算。
    • 代码
    • 结果(加法和减法各执行一次)
    • 注意:

      • int (select(char))(int,int);//运算符有优先级,首先运算的是参数为char且返回值为指针的指针函数select(char),其次可以看成参数为两个int且返回值为int的函数指针int (*)(int,int);
      • int (select(char op))(int num1,int num2){}//该函数可以直接看成select指针函数,返回值为满足int ()(int,int);的函数指针