结构体在C中默认是公有的,包含在<string.h>头文件中。
===============================================================
结构体声明(在函数外):
struct person {
char number;
int age ;
char name[10] ;
float high ;
};//person是结构体的数据类型名,可以根据需要随意修改。
//PS:结构体中定义的变量后面要用“;”结尾,声明完也要加“;”。
=====================================================
计算结构体的大小:
遵循一下规律:
1.当前结构体大小是下一个类型的整数倍,否则用字节补齐;
2.总大小是最宽字节的整数倍,否则用字节补齐;(64位是8字节,32位是4字节)
3.数组在结构体中单一拆分进行对齐;long long型和double型在32位中将8字节拆分成2 个4字节;64位则是8字节;
4.补齐的字节中不能存放数据。
如上面的结构体,按32位系统进行计算:
1+3(按规定1,补齐成下一个的1倍)+4+10(按规定3,看成10个1)+4+2(按规定2,补齐为4个倍数)
#pragma pack(1)
这个表示最宽字节为1,也就是没有补齐,大小为直接相加;
(4)也就是32位的默认,最宽字节为4。
==============================================================
在函数内定义结构体:
struct 【结构体数据类型名】 【结构体变量名】;
方法一:
struct person jim ;
jim.age=30;
strcpy(jim.name,"jim");//调用strcpy函数给数组变量赋值
jim.high=1.73;
printf("age:%d\n",jim.age);
方法二:
struct preson jim = {
.age=10,
.name="jim",
};//PS:和声明不同,定义时,里面定义完变量用“,”结尾,别忘了定义完结构体后最后的“;”
=============================================================
结构体指针的声明和定义:
struct 【结构体数据类型名】*【结构体指针变量名】;
struct person* pa=NULL;
pa=(struct person*) malloc (sizeof (struct person) );
//在未定义结构体,只定义结构体指针时,要分配一个结构体的空间,否则系统只分配4个字节给指针。
pa->age =10;//用指针指向结构体内数据方法
printf("pa->age:%d\n",pa->age);
free(pa)
==============================================================
在结构体中用函数指针调用函数:
struct person{
int age;
char* name;
int (*peat)(char*);
};
void eat(char* name)
{
printf("%s\n",name);
}
int main()
{
struct person jim;
jim.peat=eat;
jim.peat("rice");
return 0;
}
结果输出rice
===================================================
结构体类型名的重定义:
typedef struct person{
int age;
char* name;
}PRE,*PPRE;
int main()
{
PPRE a;
a=(struct person*)malloc(sizeof(struct person));
a->name ="jim";
a->age = 10;
PRE b;
b.name = "kaka";
b.age = 21;
free(a);
return 0;
}
===========================================================
联合
union person{
int age;
char name;
};
int main()
{
union person a;
a.age = 10;
a.name = 'x';
}
所占空间大小为联合体中占用空间最大的类型的大小。联合只有一块空间,重复输值回覆盖当前的值。
C++中的结构体
class person{
private:
int age;
char* name;
public:
int eat(char* name)
{
printf("%s\n",name);
}
int run();
};
int main()
{
jim.eat("jitui");
return 0;
}