C语言示例讲解结构体的声明与初始化方法

目录
  • 一、结构体声明的结构
    • 1.直接声明
    • 2.使用typedef声明一个新的类型
    • 3.不完全声明
  • 二.结构体初始化
    • 1.声明(同时定义)时直接赋值
    • 2.定义时直接赋值
    • 3.定义后赋值
    • 4.指定初始化

一、结构体声明的结构

1.直接声明

struct tag {
    member-list;
    member-list;
    member-list;
    ...
} variable-list;

tag 是结构体类型的标签。

member-list 结构体的元素定义,比如 int i; 或者 float f,或者其他有效的变量定义。注意此处使用“;”结尾。

variable-list 结构体变量,定义在结构的末尾,最后一个分号之前,可以指定一个或多个结构变量。结构体标签和结构体变量可以不必同时出现。

2.使用typedef声明一个新的类型

typedef struct
{
    int a;
    char b;
    double c;
} Simple_t;
Simple_t u1, u2[20], *u3;

现在可以用Simple_t作为类型声明新的结构体变量。

3.不完全声明

(C99 6.2.5)不完整类型(incomplete types):与对象类型相反,包括那些类型信息不完整的对象类型(incompletely-defined object type)以及空类型(void)。

有时候,必须声明一些相互之间存在依赖的结构,可能是自包含,也可能互相依赖,这时就需要不完全声明。

情况一:自包含

//此结构体的声明包含了指向自己类型的指针
struct NODE
{
    char string[100];
    struct NODE *next_node;
};

情况二:互相包含

struct B;    //对结构体B进行不完整声明
//结构体A中包含指向结构体B的指针
struct A
{
    struct B *partner;
    //other members;
};
//结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明
struct B
{
    struct A *partner;
    //other members;
};

注意:以上两种结构体声明中的元素都是指针指向结构体,没有遇到过不是指针的(理论上也不可行)。

注意:要分清结构体类型声明和变量定义(声明是不会占用内存空间的,而变量定义会占用相应内存空间)。如:

struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
};

是结构体类型声明;

struct Student student1;

是结构体变量定义;

struct Student{         //声明结构体
    char name[20];      //姓名
    int num;            //学号
    float score;        //成绩
}student1;

是结构体类型声明的同时定义一个结构体变量。

二.结构体初始化

1.声明(同时定义)时直接赋值

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};

2.定义时直接赋值

# include <stdio.h>
struct AGE
{
    int year;
    int month;
    int day;
};
struct STUDENT
{
    char name[20];
    int num;
    struct AGE birthday;
    float score;
};
int main(void)
{
    struct STUDENT student1 = {"小明", 1207041, {1989, 3, 29}, 100};
    return 0;
}

注意:STUDENT是结构体类型的标签,而不是结构体变量。

3.定义后赋值

 struct STUDENT student1;
 student1.num = 1207041;

4.指定初始化

(C99标准)指定初始化(designated initializer),指定部分/全部元素初始化。

struct book gift =
{
     .value = 25.99,
     .author = "James Broadfool",
     .title = "Rue for the Toad"
}; 

注意:最后一个元素赋值后边加不加逗号都没有问题。

到此这篇关于C语言示例讲解结构体的声明与初始化方法的文章就介绍到这了,更多相关C语言结构体声明与初始化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C语言中结构体的使用

    目录 结构体的声明 结构体成员的类型 结构体成员的访问 结构体的声明 结构体的定义:结构体是一些值的集合,这些值称为成员变量,结构体的每个成员可以是不同类型的变量. 举例: //定义结构体类型 struct tag//struct结构体关键字 tag结构体标签 struct tag结构体类型 { //成员变量 char name[20]; short age; char telphone[12]; char sex[5]; }s1,s2,s3;//s1,s2,s3是三个全局结构体变量 int m

  • C语言中结构体的内存对齐规则讲解

    目录 1.结构体的内存对齐规则 2.例子 3.为什么存在内存对齐 4.如何修改默认对齐数 1.结构体的内存对齐规则 1.第一个成员在与结构体变量偏移量为0的地址处. 2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处. 对齐数=编译器默认的一个对齐数与该成员大小的较小值.(VS中默认的对齐数是8) 3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数 )的整数倍. 4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最

  • C语言详解结构体的内存对齐与大小计算

    目录 结构体的内存对齐 1.计算结构体的大小 2.结构体的对齐规则 3.为什么存在内存对齐? 4.总结 结构体的内存对齐 1.计算结构体的大小 struct S1 { char c1; // 1 byte,默认对齐数为8,所以c1的对齐数是1,第一个成员变量放在与结构体变量偏移量为0的地址处 int i; // 4 byte,默认对齐数为8,所以i的对齐数是4,所以i要放到偏移量为 4的整数倍 的地址处 char c2; // 1 byte,默认对齐数为8,所以c2的对齐数是1,所以c2要放到偏

  • C语言深入回顾讲解结构体对齐

    目录 结构体对齐问题 结构体嵌套结构体 强制内存对齐 拓展求结构体成员的偏移量 结构体对齐问题 1.知识点的引入: struct data1 { char a;//1B int b;//4B }; void test01() { printf("%d\n",sizeof(struct data1));//8B 为啥? } 2.对齐规则(默认对齐) 第一步:确定分配单位(每行开辟多少字节) 结构体中最大的基本类型的长度 为分配单位. 第二步:确定成员的偏移位置. 偏移位置:成员自身类型的

  • C语言简明清晰讲解结构体

    目录 本质 简单使用 一些写法 我套我自己 内存对齐 举例-int char char 举例-char int char 举例-char char int 由结构体指针访问成员 本质 一些值的集合. 简单使用 #include <stdio.h> struct User { char uName[20]; char uPass[20]; }; int main() { struct User u1 = { "abc","123" }; printf(&q

  • C语言超详细讲解结构体与联合体的使用

    目录 结构体 offsetof-宏 位段 枚举 联合体(共用体) 结构体 结构体内存对齐问题: 当我们在计算结构体的大小时,我们便需要清楚的知道结构体内存对齐是什么. 存在内存对齐的原因可细分为两个: 平台原因: 不是所有的硬件平台都能方位任意地址上的任意数据:某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常. 性能原因: 首先内存对齐可以提高程序的性能,当访问未对其的内存空间时,有时候处理器需要进行两次访问,而当访问对齐的内存时,只需要一次就够了.这同时也被叫做 用空间换取

  • C语言详解热门考点结构体内存对齐

    目录 一.为什么存在内存对齐 二.如何计算?(考点) 三.手撕代码 一.为什么存在内存对齐 大部分的参考资料都是如是说的: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能再某些地址处取某些特定类型的数据,否则抛出硬件异常. 2.性能原因:数据结构(尤其是栈)应该尽可能地再自然边界上对齐.原因在于,为了访问未对其的内存,处理器需要作两次内存访问:而对齐的内存访问仅需要一次访问. 总体来说:结构体的内存对齐是拿空间来换取时间的做法 二.如何计算?(考点)

  • C语言结构体超详细讲解

    目录 前言 1.结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 2.结构体成员的访问 2.1 点操作符访问 2.2 ->操作符访问 3.结构体传参 3.1 参数是结构体类型的变量 3.2 参数是结构体类型的变量的地址 3.3 结构体传参对比 总结 前言 本文开始学习结构体的知识点,主要内容包括: 结构体类型的声明 结构体初始化 结构体成员访问 结构体传参 1.结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成

  • C语言示例讲解结构体的声明与初始化方法

    目录 一.结构体声明的结构 1.直接声明 2.使用typedef声明一个新的类型 3.不完全声明 二.结构体初始化 1.声明(同时定义)时直接赋值 2.定义时直接赋值 3.定义后赋值 4.指定初始化 一.结构体声明的结构 1.直接声明 struct tag { member-list: member-list: member-list: ... } variable-list; tag 是结构体类型的标签. member-list 结构体的元素定义,比如 int i; 或者 float f,或者

  • go语言数组及结构体继承和初始化示例解析

    目录 分类 数组 数组定义 结构体 结构体继承 结构体初始化 成员的操作 同名字段 其它匿名字段 非结构体类型 结构体指针类型 结构体字段实现接口 分类 类型 名称 长度 默认值 说明 pointer 指针   nil   array 数组   0   slice 切片   nil 引⽤类型 map 字典   nil 引⽤类型 struct 结构体       数组 如果要存储班级里所有学生的数学成绩,应该怎样存储呢?可能有同学说,通过定义变量来存储.但是,问题是班级有80个学生,那么要定义80

  • C语言示例讲解动态/文件/静态功能版本的通讯录实现

    目录 一.代码展示 test.c contact.c contact.h 二.效果展示 静态版本基本功能的实现 动态版本扩容功能的实现 文件版本保存本地功能实现 一.代码展示 test.c 使用枚举类型,使得菜单部分的代码可读性更强,便于理解 #define _CRT_SECURE_NO_WARNINGS #include"contact.h" enum Option { EXIT, ADD, DEL, SEARCH, MODIFY, SHOW, SORT }; void menu()

  • Go语言学习之结构体和方法使用详解

    目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt" type integer int func main() { //类型别名定义 var i integer = 1000 fmt.Printf("值: %d, 类型: %T\n", i, i) var j int = 100 j = int(i) //j和i不属于同一类型,需要转换 fm

  • C语言示例讲解if else语句的用法

    目录 1.前言 2.if语句的语法结构 3.关于if else语句的示例 4.if else 书写形式的对比 5.例子 1.前言 (1)C语言是结构化的程序设计语言.C语言的三种基本程序结构分别是: 顺序结构:按照程序顺序执行 选择结构:根据判断结果选择分支方向 循环结构:指有一个循环体,可以根据判断条件决定循环多少次 (2)分支语句(选择语句)和循环语句 (3)什么是语句? C语言中由一个分号(;)隔开的就是一条语句. 2.if语句的语法结构 大致分为三种: if(表达式)    语句; if

  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和

  • C语言中隐藏结构体的细节

    我们都知道,在C语言中,结构体中的字段都是可以访问的.或者说,在C++ 中,类和结构体的主要区别就是类中成员变量默认为private,而结构体中默认为public.结构体的这一个特性,导致结构体中封装的数据,实际上并没有封装,外界都可以访问结构体重的字段. C++中我们尚可用类来替代结构体,但是,C语言中是没有类的,只能用结构体,但很多时候,我们需要隐藏结构体的字段,不让外界直接访问,而是通过我们写的函数进行间接访问,这样就提高了程序的封装性. 实现方法,简单来说,就是,结构体定义时,要定义在.

随机推荐