函数与数组,数组作为函数参数
一维整型数组做函数参数:
形参 数组形式 + 数组长度
实参 数组名 + 数组长度
形式上:
void printArray(int a[],int len); //形参1 表示要传的是数组这种数据
//形参2 要传的是数组的长度 (因为在函数传参后只能传入数组的地址,此时sizeof不能算出数组长度,而是结果为8(64位系统里的地址大小))
本质上:
void printArray(int a[],int len);
void printArray(int a[10],int len);
void printArray(int *a,int len); //指针变量 (接收地址这种数据)
一维字符型数组做函数参数
1.一维字符型数组 --- 用来存放字符串
因为处理的是字符串数据,字符串操作的 依据,主要看结束标志 '\0'
而不是 数组长度
注意:
一维字符型数组做函数参数
形参 数组形式
实参 数组名
二维数组做函数参数
总结:
形参 --- 二维数组形式 + 行数 //本质 一维数组 + 长度
实参 --- 数组名 + 行数 //
二维字符数组
做函数参数:
与二维整型数组 使用方式相同
形参 --- 二维数组形式 + 行数 //本质 一维数组 + 长度
实参 --- 数组名 + 行数 //
注意:
1.不要和一维字符型数组传参搞混
一维字符型数组,主要用来存放 字符串数据
而字符串数据有结束标志('\0'),故,传参时,不需要传长度
2.二维字符型数组,用来存储多个字符串
要操作时,往往都是操作多个字符串,而多个字符串没有所谓结束的标志。
看的是数组长度(行数)
总结:
1.一维整型数组 做函数参数
形参 --- 数组形式 + 数组长度
实参 --- 数组名 + 数组长度
2.一维字符型数组 做函数参数
形参 --- 数组形式
实参 --- 数组名
原型: 一维字符型数组 主要用来存储字符串数据
3.二维整型数组 做函数参数
形参 --- 数组形式 + 行数 //本质 就是一维数组的长度
实参 --- 数组名 + 行数
4.二维字符型数组 做函数参数
形参 --- 数组形式 + 行数 //本质 就是一维数组的长度
实参 --- 数组名 + 行数
标识符 的 作用域 与 可见性问题:
标识符
名字
int a; //
int maxOfArray(int a[],int len); // 函数名
作用域
名字 作用的访
局部作用域
{
} //花括号范围内 就叫局部作用域
在局部作用域 定义的变量 --- 局部变量
在全局作用域 定义的变量 --- 全局变量
全局作用域
不在 任何一个 {} 范围之内
可见性
程序运行到某一个位置 哪些名字可以被使用(被看见)
标识符的可见性的规则:
1.先定义,后使用
2.同一作用域中,不能有同名标识符
3.在不同的作用域,同名标识符,相互之间没有影响
4.如果是不同的作用域,但是作用域之间存在嵌套关系,
则,
内层的作用域的同名标识符,会屏蔽外层的作用域的同名标识符。
(就近原则)
举例:
#include <stdio.h>
int a=1;
int main()
{
printf("a=%d\n",a);
int a=2;
printf("a=%d\n",a);
if(1)
{
int a=3;
printf("a=%d\n",a);
}
}
a会依次输出1,2,3
C语言的程序5个区
栈
堆 [数据区]
字符串常量区
全局区(静态区)
--------------------------------------
代码区 [代码区]
空间角度
局部变量
特点:
局部变量 空间 一般都开栈上
如果不初始化,局部变量中的值是随机值(垃圾值)
全局变量
特点:
全局变量 空间 全局区
如果不初始化,默认初始化为0
时间角度
生命周期
int a; //什么a的空间被开辟,什么时候a的空间被销毁
局部变量的生命周期
从程序运行到定义处开始存在,到程序运行到 它作用范围结束 时 销毁
全局变量(静态变量)的生命周期
从程序开始运行时就存在了,直到整个程序运行结束时,销毁
注意:
全局变量和静态变量,不能用"变量"进行初始化
存储类别的关键字:
auto //表示它是一个自动变量 (局部变量) --- 自动申请 自动释放
static //static 修饰局部变量 此时 会被放在 全局区(静态区)
// 此时 局部变量的生命周期被延长
// 注意:
// 1.static 修饰局部变量 --只会被初始化一次
// 2.static 修饰的变量 -- 具有继承性
// 3.static 修饰的变量 -- 只能用常量初始化 (不能用变量初始化)
register // 寄存器
// 表示,把变量 存储 寄存器中
//建议性
//register 修饰的变量 ,不能 做 & //(取地址)
extern //外部的 ---表示你的变量 是存在外部的 //多文件编程
//不在当前文件中
//只能 声明 全局变量
//static 修饰全局变量
//表示限定全局变量的作用域位本文件,别的文件不能通过extern来声明使用
//用途: 保护私有数据
// 防止被引用
修饰函数 //声明函数 在别处的定义的
static 修饰函数作用和修饰全局变量作用相同
限定作用域为本文件,别的文件不能通过extern来声明使用
static
变量
局部变量
表示将局部变量存放到静态区。
延长声明周期。
存在静态区的变量
a.不能用变量初始化
b.只会被初始化一次
c.反复使用该变量时,值具有继承性。
全局变量
限定作用域为本文件,别的文件不能通过extern来声明使用
函数
限定作用域为本文件,别的文件不能通过extern来声明使用