目录
我对结构体的理解:结构体是将多种数据类型组合成一个集合,这个集合就是结构体。结构体是弱化版的类,功能没有类强大。
结构体注意点:struct一般都放在最外层定义,不放在函数内定义。
不使用结构体(先不谈”类“),会带来以下几个问题:
1)信息比较松散,不直观;
2)容易重名;
3)数据存取不方便。
结构体struct的基本形式
struct TypeName
{
//Members;
}
其中,struct是关键字,TypeName为新类型的名称,Members则是一系列成员。
1)TypeName的命名规则,和变量名的规则一样;
2)成员变量可以是 普通变量/数组 定义。
变量定义和初始化
结构体的使用方法和普通的int等类型基本相同。
程序功能:展示结构体初始化。
C语言中结构体使用:struct Contact a = {100,"nick","123456789",};关键字struct不能漏。
而C++中就不存在这么麻烦的事情。
#include "stdio.h"
struct Contact
{
int id;
char name[16];
char phone[16];
};
int main()
{
//初始化单个结构体
Contact a = {100,"nick","123456789",};
//初始化结构体数组
Contact b[4] =
{
{100,"nick","123456789",},
{99,"nancy","123456789",},
{98,"jack","123456789",},
{97,"rose","123456789",},
};
return 0;
}
读写结构体内部成员
程序功能:访问,修改结构体内部数据。(strcpy函数来自于string.h)
#include "stdio.h"
#include "string.h"
struct Contact
{
int id;
char name[16];
char phone[16];
};
int main()
{
//初始化单个结构体
Contact a = {100,"nick","123456789",};
a.id = 201;
strcpy(a.name, "John");
strcpy(a.phone, "987654321");
printf("%d %s %s", a.id, a.name, a.phone);
return 0;
}
/*
//run out:
201 nick 987654321
*/
结构体赋值
程序功能:赋值操作。
#include "stdio.h"
#include "string.h"
struct Contact
{
int id;
char name[16];
char phone[16];
};
int main()
{
//初始化单个结构体
Contact a = {100,"nick","123456789",};
Contact b = a;
return 0;
}
结构体指针
程序功能:结构体指针。
指针需要用符号->来访问成员变量,或者使用(*p).id这种方式。
还有如果申明了结构体数组,在访问时p[0].id这样使用,因为p[0]他不是指针了,已经是一个对象了,所以可以直接使用.(点号操作)。
#include "stdio.h"
#include "string.h"
struct Contact
{
int id;
char name[16];
char phone[16];
};
int main()
{
//初始化单个结构体
Contact a = {100,"nick","123456789",};
Contact *p = &a;
p->id = 3;
printf("%d %s %s", a.id, a.name, a.phone);
return 0;
}
/*
//run out:
3 nick 123456789
*/
特殊形式(匿名结构体,但一般不这么用)
struct
{
int id;
char name[16];
char phone[16];
}Info1;
该结构体没有类型名,只有变量名,可以这样定义,但一般不这么用。
另一种特殊形式(一般也不这么用)
struct Contact
{
int id;
char name[16];
char phone[16];
}Info1, Info2;
为什么不这样用?其实很显然,结构体属于类型定义,而类型定义一般会放在头文件中。你在头文件中定义2个变量岂不是很扯。
对齐问题
为什么要对齐?
因为cpu的指令要求,只能在对齐的地址上存取,属于指令集的语法要求。不对齐就没法存取。(并不是所有的CPU都有此限制。)
通常对齐规则:
short:其内存地址必须是2字节对其(地址能被2整除)
int:4字节对齐
对结构体进行padding,使得结构体保持对齐。
程序功能:打印结构体obj的地址。
#include "stdio.h"
struct Object
{
char a;
char i;
int b;
};
int main()
{
//初始化单个结构体
Object obj;
printf("a:%p b:%p \n", &obj.a, &obj.b);
return 0;
}
结构体作为成员
struct Score
{
float chinese;
float english;
float math;
};
struct Student
{
int id;
char name[16];
Score score;
};
使用指针,不直接包含:
struct Score
{
float chinese;
float english;
float math;
};
struct Student
{
int id;
char name[16];
Score *score;
};
Score _score = {80,79,25};
Student _stu;
_stu.ps = &_score;
为什么需要传地址?
如果你的变量是一个信息量特别多的结构体,如果你传值,会占用cpu和内存资源,而且这是没有必要的。干嘛不直接传地址给它,只要地址给它,只要解析地址就好,那占用资源就非常少,极其高效。
如果只读,那么就加const,变为const Contact*;想读写就不加const,就传递Contact*就行了。