C语言-结构体

一. 结构体

结构体是一种自定义数据类型。

结构体在声明是不开辟内存空间,在定义时才开辟内存空间。

结构体运算符:.:结构体成员运算符,左侧是一个结构体变量。

->:结构体成员运算符,左侧是一个结构体指针。

注意:在对结构体中的name20进行赋值时,不能使用=赋值,而应该使用strcpy函数。

cpp 复制代码
struct per{
    char name[20];
    int age;
    float height;
    char phone[20];
};//声明结构体类型,不会开辟内存空间

int	main(int argc, char **argv)
{
     struct per per1 = {"zhangsan", 20, 175.5, "110"};//定义结构体类型,会开辟空间
     struct per per2 = {.name = "lisi", .height = 180.5};//gcc支持的语法

     printf("name:%s,age:%d,height:%.2f,phone:%s\n",per1.name,per1.age,per1.height,per1.phone);

     printf("name:%s,height:%.2f\n",per2.name,per2.height);//.:结构体成员运算符

     strcpy(per2.name, "wangmazi");//这里是一个字符类型的数组,不可使用=赋值,必须使用strcpy函数进行赋值
     per2.age = 18;
     per2.height = 170.0;
     strcpy(per2.phone,"120");

     printf("name:%s,age:%d,height:%.2f,phone:%s\n",per2.name,per2.age,per2.height,per2.phone);

    struct per per3;
    struct per *pper = &per3;
    scanf("%s %d %f %s",per3.name,&per3.age,&per3.height,per3.phone);
    
    printf("name:%s,age:%d,height:%.2f,phone:%s\n",per3.name,per3.age,per3.height,per3.phone);
    printf("name:%s,age:%d,height:%.2f,phone:%s\n",pper->name,pper->age,pper->height,pper->phone);

    return 0;
}

二. 结构体的内存对齐

内存对齐的原因:

结构体大小计算规则:

  1. 第一个成员在与结构体变量偏移量为0的地址处。

  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

  1. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

  2. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

cpp 复制代码
struct per{
    char name[20];
    int age;
    float height;
    char phone[20];
};//声明结构体类型,不会开辟内存空间

int	main(int argc, char **argv)
{
    struct per per1 = {"zhangsan", 20, 175.5, "110"};//定义结构体类型,会开辟空间
    struct per per2 = {.name = "lisi", .height = 180.5};//gcc支持的语法

    printf("name:%s,age:%d,height:%.2f,phone:%s\n",per1.name,per1.age,per1.height,per1.phone);

    printf("name:%s,height:%.2f\n",per2.name,per2.height);//.:结构体成员运算符

    strcpy(per2.name, "wangmazi");//这里是一个字符类型的数组,不可使用=赋值,必须使用strcpy函数进行赋值
    per2.age = 18;
    per2.height = 170.0;
    strcpy(per2.phone,"120");

    printf("name:%s,age:%d,height:%.2f,phone:%s\n",per2.name,per2.age,per2.height,per2.phone);

    struct per per3;
    struct per *pper = &per3;
    scanf("%s %d %f %s",per3.name,&per3.age,&per3.height,per3.phone);
    
    printf("name:%s,age:%d,height:%.2f,phone:%s\n",per3.name,per3.age,per3.height,per3.phone);
    printf("name:%s,age:%d,height:%.2f,phone:%s\n",pper->name,pper->age,pper->height,pper->phone);

    return 0;
}
相关推荐
白狐_7987 小时前
408数据结构第5章:二叉树遍历序列题——技巧、判断与真题型总结
数据结构
命运之光9 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光10 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
Forever Nore10 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
沫璃染墨11 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
旖旎夜光13 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
qq_4480111613 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机
不一样的故事12614 小时前
芯片设计是一个高度复杂、分工精细的系统工程
数据结构·经验分享
梁辰兴15 小时前
软件工程:面向数据结构的设计方法
数据结构·软件工程·梁辰兴·面向数据结构的设计方法·jackson方法·warnier方法·方法比较
en.en..15 小时前
C 语言嵌入式事件驱动状态机完整教程(枚举配套)
c语言·开发语言