欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言知识快表(2):数值、结构体

程序员文章站 2022-07-11 20:21:09
...

1.数组

在内存里面一串连续的数据类型。

1.1 一维数组

(1)一维数组定义格式:

//类型的说明 数组名[整形表达式];

int ArrayName[10];

(2)一维数组的引用:

数组名就是数组的首地址!

//数组名[下标] 或者 *(数组名+下标)

ArrayName[0]     *(ArrayName+0)

数组的下标是从0开始的,如果数组定义为100的大小,他的下标最大的取值为 99

(3)一维数组的赋值:

对一维数组进行整体赋值:

int ArrayName[10] = {1,2,3,4,5}; //对数组进行整体赋值。

//注意:当整体赋值中的,值不能填满数组时,数组会把其余的值填写为  0  

int ArrayName[10] = {0};   //所以利用上面的规则,对数值进行清空操作

1.2 二维数组

其实,在计算机中,他是不知道什么是二维,三维 … 计算机统一把数组看作是一维而已,二维数组的概念是我们人为引入的,就是方便操作数据而已。

(1)二维数组的定义:

//类型的说明   数组名[整形表达式][整形表达式1];

int ArrayName[2][5];
   	
//二维数组的类型: 类型的说明 [整形表达式1]

int [5]   //二维数组的类型 ArrayName[2]

(2)二维数组的引用:

//数组名[下标][下标1]  

ArrayName[1][4];    

// *(*(数组名+下标)+下标1)

*(*(ArrayName+1)+4)

越界引用: 利用数组的空间是连续的,但不推荐使用

ArrayName[1][2]  可以写成  ArrayName[0][8]  

1.3 字符串数组

存放字符串所使用的数组。" " 双引号括起来的内容就是字符串,字符串的结束是 ‘\0’;

(1)定义字符串数组:

//char 数组名[数组大小]; -> 注意:定义字符数组的时候记得要考虑 /0 

char ChStrName[3] = {"abc"};  // 编译不会报错,但是我们的 /0 就会越界保存了。    

char ChStrName[4];          //这样才比较好。

(2)字符串数据的赋值方式:

除整体赋初始值,其他时候整体赋值要用 strcpy();

char ChStrName[100] = {"abcdefg"};   
char ChStrName[100] = "abcdefg";  
char ChStrName[100] = {'a','b','c','d'};

1.4 变长数组

变长数组不能在定义时赋初值,要在定义完毕后赋值。

int size = 10;
int ArrayName[size];

1.5 带缺省数组

在用户赋值的时候,计算机会根据用户赋值的个数去确定数组的大小

int ArrayName[] = {1, 2, 3, 4};

二维:不能缺省类型

int ArrayName[][] = {1, 2, 3, 4};       //错误,缺少类型    

int ArrayName[][3] = {{1, 2, 3},{4, 5, 6}};     //正确,类型为 int [3]

2.结构体

2.1 结构体的定义:

关键字 struct

/**********************************
struct      结构体名称  
	{  
        成员列表   (描述符物体的成员)  
	};
***********************************/

struct student 
{
    int ID;
    int Age;
    char Gender;
    char Name[1024];
};

2.2 结构体进行初始化:

(1)整体进行初始化

① 依次整体赋值:

//struct 结构体名称 结构体变量名 = {成员1,成员2,成员3};  

struct student xiaomin = {1001, 18, 'M', "xiaomin"};

整体初始化的时候,是根据括号中的数据依次赋值的,所以,依次的时候类型一定要匹配。(最好就是有多少个值就赋多少个)

② 不依次整体赋值:

//struct 结构体名称 结构体变量名 = {.成员1=数据,.成员3=数据};

struct student xiaomin = {.ID = 1001, .Gender = 'M'};

(2)结构体中的每一个数据进行赋值

//结构体变量名.成员 = 数据;  

struct student xiaomin = {0};

xiaomin.ID = 1001;
xiaomin.Age = 18;
xiaomin.Gender = 'M';

//xiaomin.Name = "xiaomin";         //错误的,Name表示首地址
strcpy(xiaoming.Name,"xiaoming");   // 复制要用strcpy();

2.3 结构体的引用

//结构体变量名.成员X;  

xiaomin.ID

当结构体变量名为指针的时候我们的赋值与引用, “->” 符号去访问变量 (把 . 改为 ->)

struct student *pSt = &xiaomin;

pSt->ID = 1001;
pSt->Age = 18;
pSt->Gender = 'M';

2.4 结构体的大小计算:

结构体在分配成员的空间大小时 是根据 最大的数据类型 去分配的 。

如果最大的数据类型为 2个字节 就按照 2字节对齐, 4个字节 就按照 4字节对齐

struct  test
{
	int a;   //->  4
	char b;  //->  1    --》  4
	int c;   //->  4 

};

sizeof(struct test);  //  12   --》 4字节对齐

根据分配原则得到:
在定义结构体成员时,相同的类型放到一起,这样定义出来的结构体大小是最节省空间的

5.共用体

它里面的空间是使用最大的哪一个数据类型的空间

关键字 union

/********************************
union  共用体名称   
{
	成员列表;  ->基本的数据类型
}
********************************/

union  test
{
	int a;   //->  4
	char b;  
	int c;   

};

sizeof(union test);  // 4  --》最大数据类型为int

6.枚举类型

把一个类型中的所有可能取值都列举出来,自动赋值不需要用户去赋值(用描述一些存在的事物),其实就是一个整形,成员列表中不需要写类型 (默认是整形)

关键字 enum

enum 枚举名称
{
    成员;
}
相关标签: C语言