美文网首页
C-结构体

C-结构体

作者: 小石头呢 | 来源:发表于2019-08-04 22:54 被阅读0次

结构体:用户自定义可用的数据类型,允许存储不同类型的数据项

一.定义结构

在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。

struct tag { 
    member-list
    member-list 
    member-list  
    ...
} variable-list ;
  • tag 是结构体标签。

  • member-list 是标准的变量定义。

  • variable-list 结构变量,定义在结构的末尾,可以指定一个或多个结构变量

定义一个结构体变量和枚举一样有三种方式:

  • 1.先定义结构体类型,再定义结构体变量
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};

struct Books book;
  • 2.定义结构体类型的同时定义结构体类型
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;
  • 3.省略结构体名称,直接定义结构体
struct {
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

二.结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

#include <stdio.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book1 = {"C 语言", "RUNOOB", "编程语言", 123456};

struct Books book2;
book2  =  {"C 语言", "RUNOOB", "编程语言", 123456};

int main(){
    printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book1.title, book1.author, book1.subject, book1.book_id);
}

//运行结果
title : C 语言
author: RUNOOB
subject: 编程语言
book_id: 123456

三.访问结构成员

为了访问结构的成员,我们使用成员访问运算符.

#include <stdio.h>
#include <string.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
int main( ){
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   printf( "Book 1 title : %s\n", Book1.title);
   printf( "Book 1 author : %s\n", Book1.author);
   printf( "Book 1 subject : %s\n", Book1.subject);
   printf( "Book 1 book_id : %d\n", Book1.book_id);
 
   /* 输出 Book2 信息 */
   printf( "Book 2 title : %s\n", Book2.title);
   printf( "Book 2 author : %s\n", Book2.author);
   printf( "Book 2 subject : %s\n", Book2.subject);
   printf( "Book 2 book_id : %d\n", Book2.book_id);
 
   return 0;
}

//运行结果
Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

四.结构体作为函数参数

可以把结构作为函数参数,传参方式与其他类型的变量或指针类似

#include <stdio.h>
#include <string.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* 函数声明 */
void printBook( struct Books book );
int main( ){
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 输出 Book1 信息 */
   printBook( Book1 );
 
   /* 输出 Book2 信息 */
   printBook( Book2 );
 
   return 0;
}

void printBook( struct Books book ){
   printf( "Book title : %s\n", book.title);
   printf( "Book author : %s\n", book.author);
   printf( "Book subject : %s\n", book.subject);
   printf( "Book book_id : %d\n", book.book_id);
}

//运行结果
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

五.指向结构体类型的指针

struct Books *struct_pointer;

定义指向结构体的指针,方式与定义指向其他类型变量的指针相似

struct_pointer = &Book1;

可以在上述定义的指针变量中存储结构体变量的地址

struct_pointer->title;

为了使用指向该结构的指针访问结构的成员,必须使用 -> 运算符

#include <stdio.h>
#include <string.h>
 
struct Books{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* 函数声明 */
void printBook( struct Books *book );
int main( ){
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 通过传 Book1 的地址来输出 Book1 信息 */
   printBook( &Book1 );
 
   /* 通过传 Book2 的地址来输出 Book2 信息 */
   printBook( &Book2 );
 
   return 0;
}

void printBook( struct Books *book ){
   printf( "Book title : %s\n", book->title);
   printf( "Book author : %s\n", book->author);
   printf( "Book subject : %s\n", book->subject);
   printf( "Book book_id : %d\n", book->book_id);
}

//运行结果
Book title : C Programming
Book author : Nuha Ali
Book subject : C Programming Tutorial
Book book_id : 6495407
Book title : Telecom Billing
Book author : Zara Ali
Book subject : Telecom Billing Tutorial
Book book_id : 6495700

六.结构体的存储大小

  • 结构体中成员变量分配的空间是按照成员变量中占用空间最大的来作为分配单位

  • 同样成员变量的存储空间也是不能跨分配单位的,如果当前的空间不足,则会存储到下一个分配单位中

结构体内存大小对齐原则:

  • 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。

  • 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding)。即结构体成员的末地址减去结构体首地址(第一个结构体成员的首地址)得到的偏移量都要是对应成员大小的整数倍。

  • 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在成员末尾加上填充字节。

#include "Test.h"

int main(){

    struct Person{

        char *name;
        
        double score;

        int age;
    };

    printf("%d\n",sizeof(struct Person));

    struct Student{
        char name[10];
        int age;
        double score;
    };

    printf("%d\n",sizeof(struct Student));

    return 0;
}

运行结果:
24
24
Person结构体大小分析
Student结构体大小分析

相关文章

  • C-结构体

    结构体:用户自定义可用的数据类型,允许存储不同类型的数据项 一.定义结构 在一般情况下,tag、member-li...

  • C-共用体

    共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。 您可以定义一个带有多成员的共用体,但是任何...

  • C-程序结构

    C程序主要包括以下部分 预处理指令 函数 变量 语句&表达式 注释 HelloWorld例子 程序的第一行 #in...

  • 结构体

    [toc] 结构体的定义方式 先定义结构体类型,再定义结构体变量 定义结构体类型的同时定义结构体变量 定义结构体类...

  • 【C语言笔记】<十九>结构体

    结构体的基本概念 结构体初始化 结构体的内存存储细节 结构体定义的方式 结构体类型的作用域 指向结构体的指针 结构...

  • C结构体和链表

    一,结构体变量定义及初始化 二,无名结构体 备注:无名结构体很少使用 三,宏定义结构体 四,结构体嵌套 五,结构体...

  • 结构体

    结构体定义* 结构体中的格式:* struch 结构体名* {* 结构体成员变量* }* 结构体中的特点* 1.结...

  • 结构体数组的定义

    结构体数组的定义 1、先定义结构体类型,再定义结构体数组 2、定义结构体类型的同时定义结构体数组 3、省略结构体类...

  • C#结构体,析构方法,跨程序访问

    结构体 结构体定义 结构体的语法格式: struct + 结构体名 { 结构体成员变量(相当于类中的字段) } 结...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

网友评论

      本文标题:C-结构体

      本文链接:https://www.haomeiwen.com/subject/lnsydctx.html