C语言之数据类型汇总(二)


在这里插入图片描述

数组

定义:数组是一种用于连续存储同种数据类型的数据结构。

#include<stdio.h>

struct Student{
	int old;
	int class;
	int hight;
	float score;
};

int main(){
	int a[10] = {0,1,2,3,4,5,6,7,8,9}; //定义一个可以存储10个int类型的数组a
	float f[2] = {1.0,2.5}; //定义一个可以存储2个float类型的数组f
	struct Student class3[50] = {0};//i定义一个可以存储50个学生结构体数组Class3
}

数组的操作:下标运算,a[0]表示a数组的第0个元素,a[1]表示a数组的第1个元素,a[i]表示数组的第i个元素。

指针

指针:用于存储内存地址的数据类型。
指针和数组后面单独叙述。

枚举

C语言中的枚举(enum)用于定义一组命名的常量。它们提供了一种方式来表示具有离散值的变量或选项集合。

enum{
    ACC_OFF = 0,
    ACC_ON,
    IGN_OFF = 3,
    IGN_ON,
};

枚举的特性:
1.枚举的第一个元素若未给初始值,则默认为0。
2.枚举中某个常量的值 = 前一个值 + 1。
ACC_ON = ACC_OFF + 1 = 2;
IGN_ON = IGN_OFF +1 = 4;
3.枚举变量其实是一个 int 类型的常量集合。数据大小也是4byte。

枚举的主要作用如下:

1.常量命名:枚举允许我们为一组相关的常量指定有意义的名称。这样可以提高代码的可读性和可维护性,因为使用枚举常量的代码更易于理解。

2.替代整数值:枚举常量可以代替使用硬编码的整数值,使代码更具可读性。例如,使用enum定义星期几的常量可以替代使用0到6表示每个星期几的代码。

3.switch语句:枚举常量在switch语句中非常有用。使用枚举常量作为switch语句的条件可以使代码更加清晰,易于理解,并且可以避免使用大量的if-else语句。

总之,C语言中的枚举提供了一种方便的方式来定义一组常量,使代码更易读、可维护

在C++中: 通过枚举类型创建一个变量,它只能取枚举中定义的某个值,启动限制取值范围的作用
1.枚举变量在C语言中可以超出它的取值范围,
2.在C++中枚举变量不能超出取值范围,因为C++中只允许用enum中的常量给enum变量赋值。

C代码

#include <stdio.h>
#include <stdbool.h>

typedef enum ACC_STATE{
    ACC_OFF = 0,
    ACC_ON = 1,
}AST;

int main()
{
    AST accst = ACC_OFF;
    accst = ACC_ON;
    accst = 7; //C语言不会报错,可以超过枚举范围赋值
    printf("accst = %d accst_size = %d\n",accst,sizeof(accst));
    return 0;
}

C++代码

#include<iostream>

typedef enum STATE{
    A,
    B,
    C,
    D,
}STA;

int main()
{
    STA c = A;
    c = D;
    c = 3; //error
    std::cout << c << std::endl;
    return 0;
}

结构体

上文中数组是存储同一种数据类型集合的数据结构。
结构体:它是一种可存储多个不同数据类型的数据结构。

#include <stdio.h>

struct Student{
    int old;
    int class;
    int hight;
    float score;
}xm;      
//声明结构体S图dent,并定义一个全局的结构体变量xm
//old,class,hight,score都叫做结构体Student的成员变量

/*
struct {
    int old;
    int class;
    int hight;
    float score;
}xs; //这样可以定义一个结构体变量xs,但是无名的结构体就无法再定义其他结构体变量。

//无名结构体与typedef结合使用可以重命名一个结构体类型。下次使用该类型定义变量时,会简单很多。
typedef struct{
    int old;
    int class;
    int hight;
    float score;
}STD;   //使用typedef结构体重命名,将这个无名的结构体类型重命名为STD类型。
*/

int main()
{
    struct Student xh = {1,2,3,4.0}; //结构体初始化
    xm = xh; //结构体可以整体赋值
    printf("xm.old = %d,xm.score = %f\n",xm.old,xm.score); //xm.old ->结构体变量名.成员变量名 来获取结构体变量中某个成员的值
    return 0;
}

位域

在存储空间宝贵的情况下,有时候需要将多个成员保存在一个字节中,就会采用到位域这种数据类型。

#include <stdio.h>

typedef struct{
    unsigned int old:8;
    unsigned int class:4;
    unsigned int hight:8;
//  unsigned int :0;
    unsigned char sex:1;
    //char sex; //位域需要使所有成员的符号都保持一致。否则存储的数据会出错。
    unsigned char bloodtype:3;
    unsigned char grade:4;
}STD;

int main()
{
    STD xm;
    xm.old = 24;
    xm.class = 3;
    xm.hight = 185;
    xm.sex = 1;
    xm.grade = 11;
    printf("xm.sex = %d,xm.grade = %d\n",xm.sex,xm.grade);
    printf("xm_size = %d,xm.old = %d,xm.class = %d,xm.hight = %d\n",sizeof(xm),xm.old,xm.class,xm.hight);
}

运行结果:

fan@fan-virtual-machine:~$ ./a.out
xm.sex = 1,xm.grade = 11
xm_size = 4,xm.old = 24,xm.class = 3,xm.hight = 185

总结:
1.位域的成员类型不能使用浮点类型,常见的成员类型有 unsigned int、unsigned char、int、char 等等
2.位域中的成员的符号类型必须保持一致。
3.建议位域中所有成员类型都保持一致上述是为了测试,不建议在程序中这么处理

共用体(联合体)

共用体:顾名思义,可以在同一块存储空间中存储不同的数据类型。

#include <stdio.h>

typedef struct{
    int old;
    int class;
    int hight;
}STD;

typedef union{
    int data[3];
    float fl;
    STD studentInfo;
}DATA;

int main()
{
    DATA a = {24,3,185};//共用体默认使用第一个成员进行初始化
    DATA b = {.fl = 1.25};//指定初始化成员的方式初始化
    printf("a.old = %d,a.class = %d,a.hight = %d\n",a.studentInfo.old,a.studentInfo.class,a.studentInfo.hight)
    printf("b.old = %d,b.class = %d,b.hight = %d\n",b.studentInfo.old,b.studentInfo.class,b.studentInfo.hight);
}

运行结果:

fan@fan-virtual-machine:~$ ./a.out
a.old = 24,a.class = 3,a.hight = 185
b.old = 1067450368,b.class = 0,b.hight = 0

总结:
1.共同用体的大小为最大的成员变量的大小。
2.公用体所有成员变量使用同一块内存相对于基地址的偏移量都是0.也就是说所有成员变量使用的起始地址是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值