数组
数组是用来存储一组数据的容器. 用于把同一类型的一组数据统一管理起来.
特点:
1.数组必须要定义长度(正整数),定义时可初始化(长度必须是常量)或之后单独初始化.
2.数组是有序的.每个数据都有角标.从0开始分配.角标不能>=数组长度.类型一致.
3.数组有地址(数组名),里面的元素也有地址.数组当参数时(长度可省)传递的是地址.
4.数组当参数传递时是指针类型.所以如果需要用数组长度要额外传递.
定义: 数据类型 数组名[长度(数量)] ;
int arr[3];
初始化:类型 数组名[(长度)]:={元素1,元素2,…}
int arr[3]={70,80,90};
初始化的第二种方式,单独初始化
int arr2[3];
// arr2={70,80,90};//错误
arr2[0]=70;
arr2[1]=80;
arr2[2]=90;
初始化的第三种方式,省略长度
int arr3[]={70,80,90};
// 数组必须要定义长度(正整数)
// 定义时可初始化(长度必须是常量)或之后单独初始化
int count=3;
// int arr5[count]={70,80,90};//错误
int arr5[count];
arr5[0]=70;
arr5[1]=80;
arr5[2]=90;
// 如果省略长度,那么表示,后面初始化几个元素,长度就为几.
int arr6[3]={1,2};
arr6[2]=3;
int arr7[]={1,2,3};
arr7[2]=3;//错误
// 数组第一个元素的地址就是这个数组的地址.二者是一致的
printf("%p---%p\n",arr7,&arr7[0]);
printf("---%lu\n",sizeof(arr7));//arr7代表是整个数组. //12
// 计算一个数组的长度
int size=sizeof(arr7)/sizeof(int);
printf("arr7的长度是=%d\n",size); //3
二维数组
二维数组是用来存储一组数组的容器. 用于把同一类型的一组数组统一管理起来.
特点:
1.与数组基本一样.但传递子数组时传递的是地址.
2.子数组数量控制行数,单个子数组长度控制列数.
3.每个子数组类型及长度一致.
定义: 类型 数组名[数组的数量][子数组的长度] ;
//第一种方式:类型 数组名[数组的数量][子数组的长度] :={{数组1}, {数组2},…}
int arr[3][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};
//第二种方式:
int arr1[3][4];
arr1[0][0]=1;
arr1[0][1]=2;
arr1[0][2]=3;
arr1[0][3]=4;
arr1[1][0]=1;
arr1[1][1]=2;
arr1[1][2]=3;
arr1[1][3]=4;
arr1[2][0]=1;
arr1[2][1]=2;
arr1[2][2]=3;
arr1[2][3]=4;
指针
指针具有两层含义:一是指一种数据类型.二是指一种保存地址的变量.
定义:int *p 表示定义一个能存int类型地址的指针变量,名字叫p
赋值:指针变量名=指针(地址)。指针获取方法(&变量名)
指针本身也有地址。指针定义后,自身地址不变,但里面存的地址可以变化。
&p表示指针自身地址,而p表示指针存的地址,*p表示指针所存地址的内存空间。
指针不初始化赋值不要使用。未赋值前地址是随机的。未赋值不可以用*p。
*修饰什么,就表示是什么的指针。判断原则:先确定变量的类型。(根据符号优先级)
全局变量
在所有函数外部定义的变量,称为全局变量。.
用于存储一个需要长期存于内存,并需要改变的变量.
跟普通变量没区别,只是位置在所有函数之外.
当需要定义一个随程序一直存于内存中,并可以被其它函数共享的变量时候.
特点:
1.生命生期跟随程序.程序启动创建,程序退出其才会销毁
2.作用域是其所在位置之下的所有函数,都可以共享并改变.
3.变量的使用遵循就近原则如果函数内有同名变量,那么用函数自已的.
4.如果没有初始化赋值,默认值是0;
结构体
是一种数据类型.是构造类型.里面可以存不同类型的数据.
用于封装不同的数据类型到一个结构中.方便使用.
定义:1.定义结构体类型 struct 结构体类型{数据类型1 名称;数据类型2 名称;…};
2.定义结构体变量及赋值: struct 结构体类型 变量名={数据1,数据2….};
取值:变量名.结构体元素变量名; 赋值:变量名.结构体元素变量名=新值;
当需要把相关联的不同数据类型封装起来一起使用的时候.
特点:
1.可在定义结构体类型时同时定义结构体变量名,可定义匿名类型结构体;
2. 同一作用域内不可重复定义结构体类型和结构变量.匿名类型结构体除外;
3.可在函数内也可在函数外,效果及用法类似于局部变量和全局变量.也可嵌套定义.
4.可同时在函数内外定义同一个类型,使用同样遵循就近原则,结构体变量也是如此.
枚举
枚举是一种数据类型.称为枚举类型.是构造类型的一种,里面存的都是有别名的整型常量.
可以把多个整型常量以别名的形式封装成一个整体,便于别的变量识别并取值使用.
当一个变量只有固定的多个int取值范围时使用.
特点:
1.枚举类型只能是int值,且不能直接用int常量,需要用别名(建议全部大写)
2.如果不设定值,那么默认第一个元素是0,以此类推;
3.同一个作用域内不能出现重复的元素.不同的枚举类型也不行.
/*
1.定义枚举类型 enum 枚举类型{元素1 , 元素1 , …};
或{元素1=0,元素2=1,}
*/
enum Day{
MONNING,//0
NOON,//1
NIGHT,//2
};
//2.定义枚举变量及赋值: enum 枚举类型 变量名=对应枚举里的一个元素名;
enum Day daystatus=MONNING;
// 取值:变量名=枚举元素名;
daystatus=MONNING;
printf("daystatus=%d\n",daystatus);
daystatus=NOON;
printf("daystatus=%d\n",daystatus);
daystatus=NIGHT;
/*用普通变量*/
int status=0;//这个0表示早上
status=1;//如果等于1表示中午
status=2;//如果等于2表示晚上.
printf("daystatus=%d\n",daystatus);
/*注意:枚举一旦类型定义成功之后里面的数据常量不能再更改*/
int a;//0表示关 1表示开,没有其它的取值
a=1;
a=0;
// 等效于:
enum Status{
CLOSE,
OPEN,
} nowStatus;
//3.同一个作用域内不能出现重复的元素.不同的枚举类型也不行.
enum Status2{
CLOSE,
OPEN=0,
} nowStatus;
/*
enum Status{
CLOSE=1.2,//错误
1,//错误
} nowStatus;
*/
//nowStatus=OPEN;
nowStatus=CLOSE;
printf("a=%d---nowStatus=%d\n",a,nowStatus);