C语言之结构体

一、结构体的定义

结构体可以由多个不同类型的数据构成。

int main()
{
//定义结构体
struct person
{
int age;
double height;
char *name;
};
//定义结构体变量
struct person p = {20, 1.55, “jack”};
struct person p2 = {.name=”jack”, .age=20; .height=1.55};  //不按顺序赋值
p.age = 30;  //结构体内部变量赋值
p.name = “rose”;
}
定义结构体变量的三种方式:

1.先定义类型,再定义变量

</pre><pre name="code" class="csharp">struct Student
{
	int age;
};

struct Student stu;

2.定义类型的同时定义变量

struct Student
{
int age;
} stu;// stu为变量名
struct Student stu2;// 也可以继续定义新变量

3.定义类型同时定义变量(省略类型名称)

struct
{
int age;
} stu;

二、结构体的内存分析

int main()
{
//声明结构体类型,不分配内存空间
struct Date
{
int year;
int month;
int day;
};
struct Date d1 = {2014, 4, 10};
struct Date d2 = {2012, 8, 9};

d2.month = 12;
int size = sizeOf(d1);
printf(“%d\n”, size);  //输出为12 = 4 + 4 + 4,三个int类型长度相加。注意:结构体所占存储空间的个数为最大成员字节数的倍数(补齐算法、对齐算法)
return 0;
}

内存示意图如下:



倘若 d2 = d1;

意味着将d1的所有成员值对应的赋值给d2的所有成员

三、结构体数组

struct RankRecord
{
int no;
char *name;
int score;
};

struct RankRecord records[3] = 
{
{1, “jack”, 5000},
{2, “jim”, 500},
{3, “jack”, 300}
};

for(int i=0; i<3; i++)
{
printf(“%d\t%s\t%d\n”, records[i].no, records[i].name, records[i].score);
}

注意:records[0] = {4, “rose”, 9000};写法是错误的,因为结构体定义不可以使用用变量名单独赋值,变量前应该有结构体类型;所以这种情况应该使用records[0].no = 4;records[0].name = “rose”;records[0].score = 9000;

四、指向结构体的指针

int main()
{
struct Student
{
int no;
int age;
};
// 结构体变量
struct Student stu = {1, 20};
// 指针变量p将来指向struct Student类型的数据
struct Student *p;
// 指针变量p指向了stu变量
p = &stu;
// 第一种方式
printf(“age=%d, no=%d\n”, stu.age, stu.no);
// 第二种方式
printf(“age=%d, no=%d\n”, (*p).age, (*p).no);
// 第三种方式
printf(“age=%d, no=%d\n”, p->age, p->no);<span style="white-space:pre">	</span>// <span style="font-family:Arial, Helvetica, sans-serif;">"</span><span style="font-family: 'Times New Roman';">p->age"</span><span style="font-family: 宋体;">也可以用来修改结构体成员变量值</span>

return 0;
}
1.指向结构体的指针的定义

struct Student *p;

2.利用指针访问结构体的成员

1>(*p).成员名称

2>p->成员名称
3>结构体变量名.成员名称


五、结构体的嵌套的使用

注意:结构体不可以包含自身作为成员

int main()
{
struct Date
{
int year;
int month;
int day;
};
// 类型
struct Student
{
int no;	// 学号
struct Date birthday;	// 生日
struct Date ruxueDate;	// 入学日期
};
struct Student stu = {1, {2000, 9, 10}, {2012, 9, 10}};
printf(“year=%d, month=%d, day=%d\n”, stu.birthday.year, stu.birthday.month, stu.birthday.day);
return 0;
}

六、枚举的使用

int main()
{
enum Sex {Man, Woman, Unkown};
// 0男 1女 -1不详
// int sex = 3;
// enum Sex s = Unkown;

// 1.定义枚举类型
enum Season
{
spring = 1,	// 如果这里等于1,那么后边的成员的值依次递增1
summer,
autumn,
winter
};
// 2.定义枚举变量
enum Season s = winter;
printf(“%d\n”, s);

return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:C语言字节对齐问题详解中提到了C语言中的字节对齐问题。在结构中,为了提高内存访问的效率,编译器会对结构进行字节对齐。这意味着结构的成员在内存中并不是紧凑排列的,而是按照一定的规则进行对齐。具的对齐规则取决于编译器和编译选项。\[1\] 引用\[2\]:在C语言中,可以使用宏offsetof来获取结构成员相对于结构开头的字节偏移量。这个宏非常有用,可以帮助我们计算出每个结构成员相对于结构开头的偏移字节数。通过这个宏,我们可以更好地理解结构的内存布局。\[2\] 引用\[3\]:在C语言中,指针和结构的组合常常用于处理复杂的数据结构。指针可以指向结构的成员,通过指针可以方便地对结构进行操作。指针和结构的组合可以实现更灵活的数据处理和内存管理。\[3\] 综上所述,C语言中的指针结构组合可以用于处理复杂的数据结构,而字节对齐问题则是在结构中为了提高内存访问效率而进行的优化。通过使用宏offsetof,我们可以更好地理解结构的内存布局。 #### 引用[.reference_title] - *1* *3* [结构指针,C语言结构指针详解](https://blog.csdn.net/weixin_34069265/article/details/117110735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言结构详解](https://blog.csdn.net/m0_70749276/article/details/127061692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值