结构体 与 typedef

目录

 

结构体

定义结构体

访问结构体成员

typedef

typedef使用实例

typedef vs #define

#define使用实例


结构体

先简单看下结构体的概念与用法:

转载:结构体

C 数组允许定义可存储相同类型数据项的变量,结构体是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。

结构体用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:

  • Title
  • Author
  • Subject
  • Book ID

定义结构体

为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct tag {

member-list

member-list

member-list ...

} variable-list ;

tag 是结构体标签。

member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。

variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。


下面是声明 Book 结构体的定义方式:

struct Books

{

char title[50];

char author[50];

char subject[100];

int book_id;

} book;

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

以下为实例:

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

//同时又声明了结构体变量s1 //这个结构体并没有标明其标签

struct

{

    int a;

    char b;

    double c;

} s1;

//此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c

//结构体的标签被命名为SIMPLE,没有声明变量

struct SIMPLE

{

    int a;

    char b;

    double c;

};

//用SIMPLE标签的结构体,另外声明了变量t1、t2、t3

struct SIMPLE t1, t2[20], *t3;

//也可以用typedef创建新类型

typedef struct

{

    int a;

    char b;

    double c;

} Simple2;

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

Simple2 u1, u2[20], *u3;

在上面的声明中,第一个和第二声明被编译器当作两个完全不同的类型,即使他们的成员列表是一样的,如果令 t3=&s1,则是非法的。

上面这句话的意思是第一个声明的结构体和第二个声明的结构体是完全不同的结构体,即使它们的成员列表一样。既然是完全不同的结构体类型,那么struct SIMPLE t1, t2[20], *t3;定义的指向结构体struct SIMPLE类型的指针t3当然不能被赋值为其他结构体类型的地址。也就是说, t3=&s,是非法的。当然,t3 = &t1;则是合法的。


访问结构体成员

为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。您可以使用 struct 关键字来定义结构类型的变量。

注意:结构体成员的访问运算符是一个点而已,不包括那个括号。

下面的实例演示了结构的用法:

#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

typedef

转载:typedef

C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。下面的实例为单字节数字定义了一个术语 BYTE

typedef unsigned char BYTE;

在这个类型定义之后,标识符 BYTE 可作为类型 unsigned char 的缩写,例如:

BYTE  b1, b2;

按照惯例,定义时会大写字母,以便提醒用户类型名称是一个象征性的缩写,但您也可以使用小写字母,如下:

typedef unsigned char byte;

您也可以使用 typedef 来为用户自定义的数据类型取一个新的名字。例如,您可以对结构体使用 typedef 来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量,如下:

typedef使用实例

#include <stdio.h>

#include <string.h>

typedef struct Books

{

char title[50];

char author[50];

char subject[100];

int book_id;

} Book;

int main( )

{

Book book;

strcpy( book.title, "C 教程");

strcpy( book.author, "Runoob");

strcpy( book.subject, "编程语言");

book.book_id = 12345;

printf( "书标题 : %s\n", book.title);

printf( "书作者 : %s\n", book.author);

printf( "书类目 : %s\n", book.subject);

printf( "书 ID : %d\n", book.book_id);

return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

书标题 : C 教程
书作者 : Runoob
书类目 : 编程语言
书 ID : 12345

typedef vs #define

#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

  • typedef 仅限于为类型定义符号名称#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
  • typedef 是由编译器执行解释的#define 语句是由预编译器进行处理的。

下面是 #define 的最简单的用法:

#define使用实例

#include <stdio.h>

#define TRUE 1

#define FALSE 0

int main( )

{

printf( "TRUE 的值: %d\n", TRUE);

printf( "FALSE 的值: %d\n", FALSE);

return 0;

}

当上面的代码被编译和执行时,它会产生下列结果:

TRUE 的值: 1
FALSE 的值: 0

猜你喜欢

转载自blog.csdn.net/Reborn_Lee/article/details/82083685