C语言进阶之函数②

接上篇

目录

数组作为函数参数

1.一维字符型数组

2.二维整型数组做函数参数

3.二维字符型数组做函数参数

标识符的作用域与可见性问题

1.可见性

2.作用域

 3.局部变量和全局变量

(1)空间角度

(2)时间角度(生命周期)

(3)存储类别的关键字

①auto

②static

③register

④extern


数组作为函数参数

1.一维字符型数组

一位字符型数组主要是用来存放字符串,本质上是处理字符串。而字符串操作的依据是看结束标志 ‘ \0 ’,而不是数组长度,所以不用传入数组长度

所以一维字符型数组做函数参数时
   形参  数组形式
   实参  数组名 

以下是简单示例,gets()函数的写法:

void Gets(char s[]) //char s[ ]会被编译器识别为char *s
{

    int i = 0;
    while ((s[i] = getchar() )!= '\n')
	{
		++i;
	}
	s[i] = '\0';
}

2.二维整型数组做函数参数

二维数组本质上是一维数组加长度,所以二维整型数组做函数参数时:

形参   --- 二维数组形式 + 行数   

实参   --- 数组名 + 行数    

以下是简单示例,找出二维整型数组里最大的值的函数:

int sumOfArray(int a[][4],int row) //需要传入二维数组形式和行数
{
	int i = 0;
	int j = 0;
	int sum = 0;

	for (i = 0; i < row; ++i)
	{
		for (j = 0; j < 4; ++j)
		{
			sum = sum + a[i][j];
		}
	}

	return sum;
}

3.二维字符型数组做函数参数

二维字符型数组的主要作用是处理多个字符串,要操作时,往往都是操作多个字符串,而多个字符串没有所谓结束的标志,看的是数组长度(行数)。这一点注意不要和一维字符型数组搞混。

做函数参数时,与二维整型数组 使用方式相同:

形参   --- 二维数组形式 + 行数

实参   --- 数组名 + 行数    

下面是简单示例,函数实现打印二维数组里的元素

void printStr(char s[][10],int row) //需要传入二维数组形式和行数
{
	int i = 0;
	for (i = 0; i < row; ++i)
	{
		puts(s[i]);
	}

}

标识符的作用域与可见性问题

1.可见性

表示程序运行到某一个位置 哪些名字可以被使用(被看见)

标识符的可见性的规则:
1.先定义,后使用 
2.同一作用域中,不能有同名标识符
3.在不同的作用域,同名标识符,相互之间没有影响 
4.如果是不同的作用域,但是作用域之间存在嵌套关系,则内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符,即就近原则。 

2.作用域

局部作用域 
        { 
        }  //花括号范围内 就叫局部作用域 
        
        在局部作用域 定义的变量 --- 局部变量 
        在全局作用域 定义的变量 --- 全局变量 
   全局作用域 
       不在 任何一个 {} 范围之内 

 3.局部变量和全局变量

(1)空间角度

C语言的程序5个区:栈、堆、字符串常量区、全局区(静态区)、代码区  

局部变量特点:局部变量 的空间 一般都开栈上。如果不初始化,局部变量中的值是随机值(垃圾值)。
全局变量特点:全局变量 的空间 开在全局区。如果不初始化,默认初始化为0。

(2)时间角度(生命周期)

比如对于 int a; 生命周期就是讨论什么a的空间被开辟,什么时候a的空间被销毁。

局部变量的生命周期 :从程序运行到定义处开始存在,到程序运行到 它作用范围结束 时 销毁。

全局变量(静态变量)的生命周期:从程序开始运行时就存在了,直到整个程序运行结束时,销毁。 

注意:全局变量和静态变量,不能用"变量"进行初始化。

(3)存储类别的关键字

语法:
 [存储类别] 类型 变量名;  

①auto

表示它是一个自动变量 (局部变量),一般存在栈上,空间自动申请,自动释放 

②static

static 修饰局部变量时,会被放在 全局区(静态区)。此时,局部变量的生命周期被延长。

注意: 因为变量此时被放在了全局区,所以static 修饰局部变量只会被初始化一次,具有继承性,只能用常量初始化 (不能用变量初始化)。

③register

意思是寄存器,表示把变量 存储 寄存器中,以提高处理效率。

注意:register 修饰的变量 ,不能 做 & ,即取地址操作。

④extern

意思是外部的 ,表示你的变量 是存在外部的,不在当前文件中,需要用多文件编程,只能 声明 全局变量。

注意:当static 修饰全局变量 ,表示限定全局变量的作用域位本文件,别的文件不能通过extern来声明使用。用途是保护私有数据 ,防止被引用。

同样地,static修饰函数时,用于声明函数 ,表示在别处的定义的 。static 修饰函数作用和修饰全局变量作用相同,限定作用域为本文件,别的文件不能通过extern来声明使用 。


static用法总结:

修饰局部变量时,表示将局部变量存放到静态区,延长生命周期。而存在静态区的变量:

a.不能用变量初始化 

b.只会被初始化一次 

c.反复使用该变量时,值具有继承性。

修饰全局变量时,表示限定作用域为本文件,别的文件不能通过extern来声明使用。

修饰函数时,表示限定作用域为本文件,别的文件不能通过extern来声明使用                

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值