函数与数组,数组作为函数参数:
1.函数传参
实参 赋值 给形参
2.数组传参
形式上:
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); //指针变量 (接收地址这种数据)
调用时:
printArray(a,5)
printArray(&a[4],5); // a --- 数组名--代表值--数组首元素的地址 ---需要的是一个地址
// a[i] //数组的下标运算 -- 本质上是个指针运算
如果是像&a[4]这样的方式传参,传递的是看做从a[4]开始,往后数10个元素的地址,显然,会发生越界a[11],a[12]未定义
注意:
如果函数传的是数组,
通过数组下标的访问方式,可以实现被调函数,修改 主调函数中的数据
一维字符型数组作为函数的参数:
注:
和一维整型数组作为函数参数 方式是一样
但是,它不需要传数组长度 (原因,是因为一维字符型数组中,主要处理的是字符串数据,
而字符串数据有自己的结束标志‘\0’)
二维数组做函数参数:
一般二维数组作为函数参数
形参:
1. 写一个二维数组的形式 (行数可以省略,列数不能省略)
(列数相当于数据类型 int[列数4] a[],相当于此时数据类型是可以装4个int的数组)
2. 需要传递行数 (sizeof失效)
实参:void print(int a[ ][4],int ranki)
1.传数组名
2.传二维数组行数
二维字符型数组作为函数参数:语法与二维整型数组类似
形参:
1. 写一个二维数组的形式 (行数可以省略,列数不能省略)
2. 需要传递行数
实参:
1.传数组名
2.传二维数组行数
总结:
1.函数的思想
2.函数语法
函数定义 //输入数据--处理--输出
函数调用
函数声明
3.注意
a. 函数传参 --- 传递过程 --- 值传递
b. 函数与数组
数组作为函数参数
一维整型数组 形参 (数组形式,长度) 实参(数组名,数组长度)
一维字符数组 形参 (数组形式) 实参(数组名)
二维整型和二维字符型
形参 (数组形式,行数) 实参(数组名,行数)
标识符的作用域 与 可见性问题
标识符 :
名字
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
变量:
//空间角度
全局变量
局部变量
//时间角度 --- 关键字 ---生命周期
auto
static 加在局部变量的定义前面
此时,将局部变量变为了静态变量
存储的空间发生变化 ---放在了静态区(全局区)
生命周期 变成 了整个程序的生命周期
c程序加载到内存中,会安排到5个区域(数据区+代码区)
栈 数据区 //局部变量 自动申请 自动释放
堆 //手动申请,手动释放
字符串常量区
全局区(静态区) //这块空间,代码编译好之后,就开始存在
//生命周期,从程序开始到程序结束
-----------------------------------
代码区 代码区