美文网首页
C语言-函数

C语言-函数

作者: 我阿郑 | 来源:发表于2021-12-13 10:40 被阅读0次

局部变量:作用域

生命期开始:自定义之处起生效
生命期结束:所在大括号结束

int main()
{
   if(1)
   {
      int b=123; // b生效 (定义之处开始)
   } // b已经失效
   
   // 不可以访问一个已经失效的变量 ❌
   printf("%d \n", b); 
   return 0;
}

int test()
{
   int a = 111; // a生效
   if(1)
   {
      printf("a: %d \n", a);
   } 
   return 0;
} //a失效

名称的覆盖: 本层的变量名覆盖上一层的变量名

int test2()
{
   int a = 1;
   {
      int a = 2;  // 每一层大括号,都是一个新的上下文
      printf("%d \n", a);
   }
   printf("%d \n", a);
   return 0;
} //a失效

全局变量:永不失效的变量

定义在函数之外的变量,称为全局变量。
全局变量永不失效,每个函数都可以访问。

int number = 1;
void test()
{ 
   number = 2;
}
int main()
{
   printf("number: %d \n",number);
   number ++;
   printf("number: %d \n",number);
   test();
   printf("number: %d \n",number);
   return 0;
}

如何选择:局部变量与全局变量

  • 只要能用局部变量解决的问题,就不用全局变量。

  • 当你发现局变量解决不了一个问题的时候,考虑用全局变量

C语言的麻烦之处

C语言不允许函数重名,所以不能实现函数重载,这给程序员带来了不小的麻烦
可以使用C++实现函数重载

返回指针的函数

指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型

返回指针类型的函数,比如下面这个函数,返回一个指向char类型变量的指针

// 将字符串str中的小写字母变成大写字母,并返回改变后的字符串
// 注意的是:这里的参数要传字符串变量,不能传字符串常量
char * upper(char *str) {
    // 先保留最初的地址。因为等会str指向的位置会变来变去的。
    char *dest = str;
    
    // 如果还不是空字符
    while (*str != '\0') {
        // 如果是小写字母
        if (*str >= 'a' && *str <= 'z') {
            // 变为大写字母。小写和大写字母的ASCII值有个固定的差值
           *str -= 'a' - 'A';
        }
        // 遍历下一个字符
        str++;
   }
   // 返回字符串
   return dest;
}

int main()
{
    // 定义一个字符串变量
    char str[] = "jia";
    // 调用函数
    char *dest = upper(str);
    printf("%s", dest); // JIA
    return 0;
}

指向函数的指针

1.为什么指针可以指向一个函数?

函数作为一段程序,在内存中也要占据部分存储空间,它也有一个起始地址,即函数的入口地址。函数有自己的地址,那就好办了,我们的指针变量就是用来存储地址的。因此,可以利用一个指针指向一个函数。

其中,函数名就代表着函数的地址。

2.指向函数的指针的定义

int sum(int a, int b) {
    return a + b;
}

int main()
{
    // 定义一个指针变量p,指向sum函数
    int (*p)(int a, int b) = sum;
    // 或者 int (*p)(int, int) = sum;
    // 或者 int (*p)() = sum;
    
    // 利用指针变量p调用函数
    int result = (*p)(1, 3);
    // 或者 int result = p(1, 3);
    
    printf("%d", result); // 4
    return 0;
}

指向函数的指针变量主要有两个用途:

  • 调用函数

  • 将函数作为参数在函数间传递

int sum(int a, int b) {
    return a + b;
}

int minus(int a, int b) {
    return a - b;
}

void counting( int (*p)(int, int) , int a, int b) { 
    int result = p(a, b);
    printf("计算结果为:%d\n", result);
}

int main()
{
    // 进行加法运算
    counting(sum, 6, 4);
    
    // 进行减法运算
    counting(minus, 6, 4);
    return 0;
}

如果以后想再增加一种乘法运算,非常简单,根本不用修改counting函数的代码,只需要再增加一个乘法运算的函数

int mul(int a, int b) {
    return a * b;
}

然后counting(mul, 6, 4);就可以进行乘法运算了

相关文章

  • iOS开发 -- C语言基础3(函数)

    iOS开发 -- C语言基础3(函数) 什么是函数 一、函数的分类 C语言中的函数就是面向对象中的"方法",C语言...

  • gcc

    C语言 c语言是面向函数的语言,所以c语言中全部都是函数 看看单文件中对函数的生命和调用。 要先对函数进行声明再进...

  • 是否还需要在源文件中添加“extern C”?

    c++调用c语言的函数时我们一般在c语言函数声明处用extern "C"包c函数。例如: extern "C"的主...

  • 2018-08-29日常C笔记

    C语言初学笔记 C语言程序是由函数组成的C语言程序启动时,系统就会自动调用名字叫main的函数C语言规定了函数定义...

  • Redis 源码简洁剖析 02 - SDS 字符串

    C 语言的字符串函数 C 语言 string 函数[https://devdocs.io/c-strings/],...

  • 函数变参的使用

    介绍C/C++,java,和go语言对函数变参的使用。 1. C/C++语言的变参 1.1 变参函数声明 变参函数...

  • 2.头文件与类的声明

    C语言和C++语言中 函数与数据使用方法的不同 C语言中由于C语言中没有某些关键字,所以数据可以被全部函数所使用 ...

  • scanf函数

    scanf函数 一、是什么? C语言下的scanf()函数是样式化输入函数,也称为阻塞式函数,有C语言自带的库提供...

  • C++语言学习之面向对象

    1.C语言与C++语言的区别 C++面向对象 C 面向过程 函数+结构体 C++可以运行调用C语言 反之 C语言无...

  • C/C++ 函数地址

    C 函数 C 语言中没有类的概念,只有普通的函数。 控制台输出: C++ 函数 C++ 函数有如下几种: 1)普通...

网友评论

      本文标题:C语言-函数

      本文链接:https://www.haomeiwen.com/subject/pypkfrtx.html