三---c语言复杂数据类型


 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。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值