首页 > 其他分享 >结构体详解

结构体详解

时间:2022-11-03 00:46:33浏览次数:46  
标签:struct int 嵌套 详解 对齐 结构 name

结构体

声明与初始化

结构体成员数据类型可以是数组,常量,字符串,指针,或其它结构体类型

//声明结构体类型
struct tag_name
{
    数据类型 变量名1;
    数据类型 变量名2;
}var-list;

//**不完全声明(匿名声明)** 
//局限性:只能用一次
//必须嵌套声明 
struct 
{
    member_list
}var1;

1.定义结构体变量(全局和局部皆可以)
struct tag_name 变量名;
2.初始化
struct tag_name 变量名 = {val}

例如:

例如:
struct Student
{
    char name[20];
    int age;
}stu1={"李四",25}; // 结构体嵌套初始化

// 结构体初始化
struct Student stu2 = {"张三",28}; 

结构体的自引用

链式存储:根据第一个结点data域找到下一个结点的地址

struct Node
{
    int data;
    struct Node* next;
}

结构体的成员访问

//第一种 直接访问
stu1.name;
//第二种 定义结构体指针类型指向结构体 间接访问
struct Student* stu3 = &stu1;
stu3->name;

结构体传参

struct S
{
 int data[1000];
 int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
 printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
 printf("%d\n", ps->num);
}
int main()
{
 print1(s);  //传结构体
 print2(&s); //传地址
 return 0;
}

结构体传参:传值以及传址*
1.使用情况
如果不修改原值,建议传参传值,
需要对原值进行操作,传参传址
2.性能优选
函数传参传值,是对于原值(实参)的一份拷贝,函数> 传参,需要压栈,如果结构体过于大,对于系统的开> 销也是巨大的,性能也会随之下降

结构体的内存对齐

结构体对齐的规则
1.第一个成员在结构体变量偏移量为0的地址处。
2.其它成员要对齐到对齐数的整数倍地址处
对齐数=编译器默认的对齐数与该成员大小的较小值
vs默认对齐数8
3.结构体总大小为最大对齐数的整数倍
4.结构体嵌套结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所最> 大对齐数(喊嵌套结构体的对齐数)的整数倍。

//普通情况
struct Student
{
    int arr[5];
    char c;
};


//嵌套情况
struct Student2 
{
    struct Student1 stu1;
    int a;
};

标签:struct,int,嵌套,详解,对齐,结构,name
From: https://www.cnblogs.com/worker618/p/16853065.html

相关文章

  • Fiddler状态面板详解
    Fiddler状态面板详解 1.简介  按照从上往下,从左往右的计划,今天就轮到介绍和分享Fiddler的状态面板了。2.状态面板概览Fiddler的状态面板概览,如下图所示:3.状态......
  • 这数据库的结构设计,还能再糟糕一点吗?
    聊聊一个糟糕的数据库架构设计带来的问题。技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。以一个例子为切入点一、问题背景某系统已经线......
  • 【算法与数据结构2】数据结构基础----数组、列表
    一、物理结构数组  数组是存储相同数据类型的元素的一种有序数据结构,通过下标进行存储。查找的时间复杂度为O(1),而删除和添加的时间复杂度为O(n)。其代码实现如下:pu......
  • 操作符的补充&详解
    算数操作符1.除了%操作符之外,其他的几个操作符可以作用于整数和浮点数。2.对于/操作符,如果两个操作数都为整数,执行整数除法,而只要有浮点数执行的就是浮点数除法3.%操作符......
  • 类的作用域详解(C++ primer7.4笔记)
    7.4类的作用域名字查找的过程:(查找匹配的声明)在名字所在块中寻找语句,查找使用名字之前出现的声明。如果没找到,查找外层作用域还没找到就报错类的定义分为两步处理:......
  • 给表格增加行间距的同时支持合并单元格,但不破坏 table 语义化标签结构的简单方法
    背景需要实现一个非典型的表格:表头下方,以及部分tr下方(将多个tr视作一个列表项,最后一个tr与下一个列表项之间)需要添加空白,但不能破坏table、thead、tbody、th、tr......
  • BigDecimal保留两位小数点示例详解
     BigDecimal保留两位小数点非常简单,BigDecimal是一个java数据类型,它能有效的保持数据的精度,下面是一个BigDecimal保留两位小数点的用法示例。publicclassMyDemo{pu......
  • JavaWeb三大组件之Filter学习详解
    JavaWeb三大组件之Filter学习详解Filter基本上可以说存在所有的JavaWeb项目中,比如最基本的一个请求参数的编码​​CharacterEncodingFilter​​,大家一般都会配置下,那么filte......
  • python 魔术方法__str__及__repr__方法详解
    __str__方法__repr____str__自定义类的时候__str__方法的作用。这个魔术方法__str__主要的作用是在print(实例对象)的时候返回你指定的字符串,一般来说在定义类的时候不......
  • hive的trunc函数详解
    一、日期TRUNC函数为指定元素而截去的日期值。其具体的语法格式:TRUNC(date[,fmt])其中:date一个日期值fmt日期格式,该日期将由指定的元素格式所截去。忽略它则由最......