1,数组
数组,就是用来存储一组数据的,数组中只能存储一种类型的数据,格式为:
元素类型 数组名 [元素个数];
比如: int num[3];
数组内的每一个数据叫做数组的元素,元素有先后顺序,每个元素都有一个唯一的下标,从0开始。可以在定义定义数组的时候对数组内的元素进行初始化,也可以定义完数组在对数组内的元素进行赋值:
正确的初始化方法:
int num[3] = {2,4,6};
int num[5] = {2,4,6};
int num[5] = {[2] = 7, [3] = 9};
int num[] = {2,4,6};
int num[’A’] = {2,3,4,8};
定义数组的时候对元素进行赋值,如果赋值的 个数小于数组长度,后面的元素会自动赋值为0,也可以对指定位置的元素赋值,也可以不指定数组长度,由系统自动确定数组长度,但是不可以不指定数组长度的同时在定义的时候不进行初始化赋值:
正确的写法:
int num[5]; num[0] = 2; num[1] = 4;
错误的写法:
int num[];
int num[5]; num ={1,2,3,4,5};
数组中的元素在内存中的地址是仅仅挨着的,比如int类型的数组,0号为元素的地址假如是0xffc1,那1号位的元素地址值就是0xffc5,因为int类型数据占据4个字节内存空间,数组中的元素一次紧挨从前往后地址值按数据类型占据字节数递加。
c语言中的sizeof方法可以返回对象占据的字节数,要想直到数组内的元素个数,也即数组的长度可以用:sizeof(数组名)/sizeof(数组类型);来获得。
如果数组中的元素是数组的话就构成了二维数组:
int num[2][3] = {
{1,2,3},
{4,5,6},
};
意思是定义一个包含int类型数据的二维数组,里面包含两个数组,每个数组内包含三个元素。
2,字符串
字符串跟上面的数组很相像,如果建立一个元素都是字符的字符数组并且结尾有0作为结束的话就成为了一个字符串。
char name[7] = ”abc”;
char name[7] = {’A’, ’B’, ’C’, 0};
char name[7] = {’A’, ’B’, ’C’, ’\0’};
都是正确的字符串创建方式,最后以0或者’\0’结束是字符串的标志,’\0’的ASCII码值就是0.两者是等价的。
char name[7] = {’A’, ’B’, ’C’};
也可以认为是一个字符串,因为后面的元素会默认为0,但不是一个标准的字符串。
char name[] = {’A’, ’B’, ’C’};
就不是一个字符串,只能认为是一个字符数组。
用strlen函数可以计算字符串的长度,strlen计算的是字符串的字符数,不是字数,且不包括’\0’,当传入一个字符串名称时,strlen会从首个元素字符的地址开始计算字符个数直到遇见\0停止。
#include <stdio.h>
int main()
{
char name1[] = ”abc”;
char name2[] = ”哈abc”;
char name3[] = ”ab\0c”;
char name4[] = {’d’, ’e’};
int a = strlen(name1);
int b = strlen(name2);
int c = strlen(name3);
int d = strlen(name4);
printf(”a = %d, b = %d, c= %d, d = %d”, a,b,c,d);
return 0;
}
则输出结果是a = 3, b = 6, c = 2, d = 4,因为strlen计算的是字符数,汉字占三个字节,name1长度为3,name2长度为6,strlen遇到\0则会停止,name3长度为2,name4只能算是一个字符数组,其中没有\0,由于name3和name4是依次创建的,它们在内存中的地址紧挨着且name4的地址值较小,用strlen计算name4时从’d’开始向下计数,一直访问到name3中的\0才结束,所以输出结果会是4。
3,结构体
数组用来存储一堆相同类型的数据,如果想要存储一些不同类型的数据就要用到结构体。结构体格式:
struct 结构体名
{
成员1类型 成员1名称;
成员2类型 成员2名称;
成员3类型 成员3名称;
……
};
例如:
struct Person
{
int age;
double height;
char *name;
};
定义完结构体类型后就可以根据类型定义结构体变量,需要注意的是结构体只能在定义的同时进行初始化,这点和数组一样,正确写法:
struct Person p = {20,1.55,”jack”};
p.age = 25;
p.name = ”rose”;
struct Person p2 = {.height = 1.77, .name = ”jim”, .age = 27};
错误写法:
struct Person p3;
p3 = {17, 1.66,”meimei”};
结构体可以在定义类型的同时定义变量:
struct Person
{
int age;
double height;
char *name;
} p;
struct Person p2;
也可以省略类型名称:
struct
{
int age;
double height;
char *name;
} p;
由结构体作为元素组成数组即是结构体数组:
#include <stdio.h>
int main()
{
struct Person
{
int age;
double height;
char *name;
};
struct Person p[3] =
{
{17, 1.67, ”liming”},
{15, 1.64, ”wanglei”},
{18, 1.73, ”zhangsan”},
};
p[0].age = 20;
//只能指定结构体元素中的元素进行数据修改,不能直接修改整个结构体元素
/*
错误写法:
p[1] = {14, 1.55, ”xiaohong”};
*/
for (int i = 0; i<3;i++)
{
printf(”%d\t%f\t%s\t”,p[i].age, p[i].height, p[i].name);
}
return 0;
}
4,枚举
从指定的几个值之中取一个可以用到枚举类型:
enum Season
{
spring,
summer,
antumn,
winter,
};
enum Season s = winter;
定义一个枚举类型后再使用枚举类型进行定义变量时给变量赋值,系统会把赋的值给枚举类型内的给定值进行比较,只有事给定的几个值中的一个时才可以成功赋值。枚举类型内的给定值可以看做是整型数据,spring相当于0,summer相当于1,antumn相当于2,winter相当于3。