C语言32个关键字
有32个关键字详细说明,还有跳转链接!
struct就是结构体,用来描述需要相同类型或不同类型数据的数据对象。
通俗的说法就是打包封装,将一些分散的数据整合在一起。
结构体的优点: 结构体不仅可以记录不同类型的数据,而且使得数据结构是“高内聚,低耦合”的,更利于程序的阅读理解和移植,而且结构体的存储方式可以提高CPU对内存的访问速度。
一般形式具体如下:
struct 结构名
{
//成员列表
类型 变量名;
类型 变量名;
....
};
举例说明如下:
//声明结构体类型
struct info
{
char name[20];
int age;
float height;
};
一般形式具体如下:
//声明结构体类型
struct info
{
char name[20];
int age;
float height;
};
//定义结构体变量
struct info person;
合并简化形式具体如下:
struct info
{
char name[20];
int age;
float height;
}person;
匿名结构体形式具体如下:
struct
{
char name[20];
int age;
float height;
}person;
一般形式具体如下:
typedef struct info
{
char name[20];
int age;
float height;
} NOM;
//定义结构体变量,以下两种效果一样
struct info person;
NOM person;
匿名结构体形式具体如下:
typedef struct
{
char name[20];
int age;
float height;
} NOM;
//定义结构体变量
NOM person;
初始化定义时—赋值
//声明结构体类型
typedef struct
{
char name[20];
int age;
float height;
} NOM;
//定义结构体变量---初始化赋值1
NOM person={"MQ",25,183.5};
//定义结构体变量---初始化赋值2
NOM person=
{
.name = "MQ",
.age = 25,
.height = 183.5
};
初始化后—赋值
strcpy(person.name,"MQ");
person.age = 25;
person.height = 183.5;
void struct_exd (NOM person)
{
strcpy(person.name,"MQ");
person.age=25;
person.height = 183.5;
}
NOM struct_exd (void)
{
NOM person;
strcpy(person.name,"MQ");
person.age=25;
person.height = 183.5;
return person;
}
初始化定义时—赋值
NOM person[2]=
{
{"MQ",25,183.5},
{"VV",22,158.5}
};
初始化后—赋值
strcpy(person[0].name,"MQ");
person[0].age = 25;
person[0].height = 183.5;
strcpy(person[1].name,"VV");
person[1].age = 22;
person[1].height = 158.5;
结构体指针变量就是指向结构体首地址的指针,并没有给变量分配内存。
所以在给结构体指针变量成员赋值前,要先分配内存。
NOM *per;
per = (NOM*)malloc(sizeof(NOM));//分配内存
strcpy(per->name,"MQ");
per->age = 25;
per->height = 183.5;
void struct_ex (NOM * person)
{
strcpy(person->name,"MQ");
person->age=25;
person->height = 183.5;
}
位结构体是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构体比按位运算符更加方便。
具体详细说明,请点击下面蓝色字体链接!
声明结构体类型的时候没有申请内存空间,定义结构体变量的时候,就分配内存空间。
由于分配内存时有默认的对齐方式,所以结构体的内存大小并不都是结构体所含变量内存的总和。
一般情况,具体信息如下:
#include <stdio.h>
typedef struct
{
char name[20];
int age;
float height;
} NOM;
int main(int argc, char *argv[])
{
printf("size=%d\n",sizeof(NOM));
return 0;
}
运行结果如下:
size=28
20(name[20])+4(age)+4(height)=28
特殊情况,具体信息如下:
#include <stdio.h>
struct MQ
{
char a;
int b;
char c;
short d;
short e;
char f;
short g;
int h;
char k;
} data={'a',0x55555555,'b',0x1111,0x2222,'c',0x3333,0x44444444,'d'};
//这样定义有利于判断填充字节
int main(void)
{
int i=0,adder=0;
printf("struct=%d\n",sizeof(data));
adder=&data;
for(i=0;i<sizeof(data);i++)
printf("%x ",*(unsigned __int8*)(adder+i));
printf("\n");
return 0;
}
运行结果如下:
struct=28
61 0 0 0 55 55 55 55 62 0 11 11 22 22 63 0 33 33 0 0 44 44 44 44 64 0 0 0
变量偏移量必须是变量所占内存的整数倍,否则填充0对齐。
结构体的总内存必须是最长变量内存的整数倍,否则填充0对齐。
变量 | 偏移量 | 内存 | 数据(hex) |
---|---|---|---|
char a | 0 | 4 | 61 0 0 0 |
int b | 4 | 4 | 55 55 55 55 |
char c | 8 | 2 | 62 0 |
short d | 10 | 2 | 11 11 |
short e | 12 | 2 | 22 22 |
char f | 14 | 2 | 63 0 |
short g | 16 | 4 | 33 33 0 0 |
int h | 20 | 4 | 44 44 44 44 |
char k | 24 | 4 | 64 0 0 0 |
内存总和28=最后变量的偏移量24+最后变量占的内存4