数组和函数
一:数组
按数组元素的类型可以分为:
字符数组 char a[10];
数值数组:
short int a[10];
int a[10]
float a[10]
double a[10]
指针数组
char *a[10]//定义了一个指针数组有10个字符指针变量
其他类型类似
结构体数组
struct stu {
成员列表
};
struct stu edu[10]//定义了一个结构体数组有十个结构体变量
按维数分为一维数组、二维数组、多维数组
int a[10];//一维数组
int a[3][5]//二维数组
int a[3][4][5]//三维数组
数组的概念:数组是一个构造数据结构 有多个元素构成,注意多个元素在内存中
连续存储,多维数组概念上是多维的,其实在内存中也是连续存储的。
数组的定义
定义方法:类型名+ 数组名 + [元素个数]
int a[10];
注意:数组名字代表数组的首地址,也就是第0个元素的地址,它是个常量。
该数组有十个元素分别a[0]~a[9]
使用数组的时候不要溢出
数组的初始化
int a[10]={1,2,3};
可以全部初始化,也可以部分初始化,如果只初始化一部分,剩余元素的值默认是0
如果给全部元素初始化,在定义数组的时候可以不给出个数
int a[]={1,2,3,4,5};//数组a有5个元素,根据初始化的个数来定数组的大小。
字符数组的初始化方法有两种
char a[]={‘h’,‘e’,‘l’,‘l’,‘o’};//用字符逐个初始化,该数组有5个元素
char a[]=“hello”//用字符串给数组初始化,注意如果用字符串的话最后一个是\0
//该数组有6个元素。
数组元素引用
数组名+[下标]
多维数组元素的引用会有多个下标
int a[3][5];
a[2][2];
注意:如果全局数组不初始化,所有的元素的值是0
局部数组如果不初始化,所有的元素的值是不确定
局部数组:在函数内部定义的或者在复合语句中定义的数组,被称为局部数组
局部数组在定义的范围内有效。
普通局部数组,生命周期是它所在的函数或复合语句
全局数组:
在函数外边定义的数组是全局数组
全局数组的生命周期是整个程序的运行过程数组一直存在。
二:函数
函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
1:函数的定义:
类型名 函数名(形参列表)
{//函数体
}
int max(int a,int b)
{
}
注意函数的定义不能嵌套定义,也就是,所有的函数都是平行的。
不能在一个函数体里,定义另外一个函数。
类型名 其实就是函数的返回值类型,也就是函数的类型。
2:函数的声明:
函数的声明就是将函数定义的第一行后边加一个分号,前边加一个extern
extern int max(int a,int b);
extern int max(int ,int );//函数声明的时候形参的名字可以没有
声明时候需要声明函数:
1:被调函数在主调函数的下边的时候需要,在主调函数之前进行声明
2:被调函数和主调函数不在一个源文件中的时候,在调用之前,要声明
声明的方法,有两种:
1:直接声明法,就是将函数定义的第一行放在主调函数之前。
2:将函数的声明放在头文件中,在主调函数所在的.c 先包含头文件。
分文件的原理
大体原理是一个.c 对应一个.h ,在c文件中定义函数,在头文件中声明函数。
注意不能把函数的定义放在 .h 头文件中,因为包含多次的时候会展开多次,导致重复定义。
注意在头文件中,一定记得防止头文件重复包含
#ifndef AAA
#define AAA
#endif
3、函数的调用:
函数名+(实参)
int num;
int x=10,y=20;
num=max(x,30+2)//实参可以是主调函数的变量,也可以是常量,常量表达式
什么叫做形参:
定义函数的时候括号里的变量就是形参。
形参是被调函数的局部变量,在函数调用之前,形参是不占用内存的。
调用的时候开辟空间,赋值,函数调用完毕后,形参就会被释放。
三:变量的存储类别
普通局部变量
在函数里或复合语句中定义的变量被称为普通的局部变量
void fun()
{
int a=3;
a++;
printf("a=%d\n",a);
}
int main()
{
fun();
fun();
fun();
}
此程序执行的结果:
a=4
a=4
a=4
静态局部变量
在定义局部变量的时候前边加static ,这样的变量被称为静态局部变量,
静态局部变量的特点:
第一次调用函数的时候分配空间初始化,函数调用完毕后不会释放,以后调用的时候不会重新分配空间
用的第一次开辟的空间,并且变量的值会保留。
void fun()
{
static int a=3;
a++;
printf("a=%d\n",a);
}
int main()
{
fun();
fun();
fun();
}
运行结果
a=4
a=5
a=6
也就说static 改变了静态局部变量的声明周期,静态的局部变量在程序运行的整个过程都存在。
普通全局变量
在函数外边定义的变量,普通的全局变量,全局变量的声明周期是整个程序的运行过程,它的作用范围
在程序的任何地方都可以使用,在使用之前要进行声明。注意全局变量定义必须放在c文件中,声明放在头文件
中,定义的时候可以赋初值,声明的时候一定不要赋值。
全局变量不初始化,值默认为0
全局变量和局部变量可以重名,因为作用范围不一样,在局部变量所在的范围,全局变量不起作用
int a=5;
int main()
{
int a=10;
printf("a=%d\n",a);
}
此程序的运行结果是 a=10
静态全局变量
在定义全局变量的时候在最前边加一个static ,这样定义的变量是静态全局变量。
静态全局变量的特点,作用范围被限定在它所在的.c 中,其他.c 中的函数没法使用,
也就说static 限定了静态全局变量的作用范围
普通全局变量和静态全局变量可以重名,因为作用范围不一样。在静态全局变量的作用范围内,全局变量
不起作用。
内部函数
定义函数的时候在返回值前边加static
这样的函数被称为内部函数
static限定了内部函数的作用范围,这一点和静态全局变量是一样的,内部函数只能在它所定义的.c 中有效。
外部函数
普通函数即外部函数,外部函数作用范围是整个程序工程,只需要在调用之前声明。
四:内存分区
堆
动态申请的内存,在堆中开辟
栈
局部变量在栈中开辟空间
静态全局区
又分为 初始化的静态全局区和未初始化的静态全局区
静态变量、全局变量,存在此区。
文字常量区
存放各种常量 100 、2.3、 ‘a’ 、“hello”
代码区
函数都放在代码区。