C语言基础:函数和数组的关系 变量的作用域和生命周期

8.函数和一维字符型数组

传参:

char 数组名[100];

定义:
返回值 函数名(char 数组名[])
{
        函数体;
}

调用:函数名(数组名);

注意:

        1.传参时只需要传递数组,不需要传递长度len,因为末尾有'\0'结束标志

        2.数组作为函数参数传递时,本质传递的是数组首元素的地址(sizeof(数组名形参)本质是求地址在计算机内存中的大小)8字节

        3.strlen等函数在被调函数中可以正常使用

9.函数和二维整型数组

传参:

返回值  数组名(int a[ ][列数],int hang)
{
    int lie=sizeof(a[0])/sizeof(a[0][0]);//列可以正常计算
}

//行数在main()里计算并传递

注意:

        1.二维整型数组做形参时,必须说明是二维数组。列必须要写,int a[ ][4];

        2.行数在形参中可以省略,但无法在自定义函数中计算,因此必须有个参数传递行数int len;

        2.二维整型数组做参数传递时,本质传递的是数组首元素地址(8字节)

10.函数和二维字符型数组

传参:

返回值 函数名(char 数组名[ ][列数],行数)
{}

函数名(数组名,行数);

11.变量的作用域和生命周期

1.变量的作用域(空间角度

作用域:标识符/变量可以被使用的范围

  • 局部作用域:在{ }内部被定义的变量,作用范围在{ }内部,被称为局部变量。

                      比如:在函数内部定义的变量、函数形参

  • 全局作用域:可使用范围在全局,在任何{ }的外部的变量,被称为全局变量。

                       比如:定义函数

注意:

        1.在同一个作用域中,不能定义同名变量

        2.标识符必须先定义再使用

        3.在具有包含关系的作用域中,若定义了同名标识符,外层标识符在内层不可见(就近原则

int j=0;    //全局变量

int main()
{
    int i=10;
    int j=20;
    {
        int i=100;
        printf("%d\n",i);    //100
    }
    printf("%d\n",i);    //10
    printf("%d\n",j);    //20
}

2.变量的生命周期(时间角度

生命周期:从变量的空间开辟到空间回收的整个生存期

  • 动态生命周期:

        局部变量:在被定义时开辟内存空间,超出其作用域范围空间被回收

  • 静态生命周期:

        全局变量:从程序运行之前空间开辟,到程序运行结束空间被回收,和程序运行生命周期一样长

        static修饰的静态变量:1.作用域不变,仍处于局部作用域;2.生命周期改变,由动态变为静态。例如:

int fun()
{
    static int a=10;
    printf("%d ",a);
    i++;
}

int main()
{
    fun();
    fun();
    fun();
    return 0;
}

//结果:10 11 12

总结:

局部变量:

   1.作用域在局部,超出局部无法访问

   2.动态生命周期,定义时开辟空间,超出作用范围空间被回收

   3.保存在栈区,未被初始化就为随机值

全局变量、static静态变量:

   1.全局变量作用于在全局,static静态变量作用域在局部

   2.静态生命周期,程序运行前开辟,程序运行结束后回收

   3.保存在数据区,未被初始化默认初值为0

   4.未初始化的储存在.bss段,系统默认清0;已初始化的存储在.data段

3.变量的存储类型

存储类型 数据类型 变量名;

变量的存储类型分为以下四种:

  • auto:默认存储类型
  • static:1.static修饰局部变量,变为静态变量,具备静态生命周期(延长局部变量的生命周期),位置由栈区变到数据区。2.static修饰函数/全局变量:该函数/全局变量只允许在当前原文件中被调用。
  • register:寄存器变量。register修饰变量时,建议编译器将改变量存储在寄存器中。寄存器离CPU近,读取更方便。寄存器没有地址,无法取址。
  • extern:修饰全局变量/函数。用来声明全局变量/函数。允许被外部的.c使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值