C语言结构体

结构体

我们已经知道了数组元素是相同数据类型的集合,这一节我们来聊聊C语言的结构体。

结构体与数组一样,属于派生数据类型,它同样是一个数据类型的集合。与数组不同的是,它是不同数据类型的集合。

语法如下:

struct tag_name[optionl]{
   dataType member1;
   dataType member2;
   ................;  
   ................;
   dataType memebrn;
}structure_variable_Name;

其中tag_name是可选的。

structure_variable_Name是标识符,通过它可以使用点(.) 运算符访问任何成员。

例如:
有这么一个需求:你需要把员工的信息保存在内存中。
员工信息:

信息 数据类型
姓名 字符串
工号 无符号整型
薪资 双精度浮点型

有两种将员工信息存入内存中的方式:

  1. 一种是对员工的信息分别声明一个变量。在这个例子中,一个员工需要声明3个变量。
  2. 另一种则是使用结构体变量,将所有员工信息声明为一个结构体。

很明显,对于程序来说,使用一个比使用3个变量方便得多。当然结构体内部还是会有3个元素。
例如:

struct empInfo
{
 unsigned char name[20];
 unsigned int empId;
 double  salary;
}emp;
 
或者
struct empInfo 
{ 
  unsigned char name[20]; 
  unsigned int empId; 
  double salary; 
};
struct empInfo emp;

empInfo:结构体名称;
emp:结构empInfo类型变量。

使用(.)运算符

结构体使用点(.)运算符访问结构体的成员。

  • emp.name = const_value1
  • emp.empId = const_value2
  • emp.salary = const_value3

使用(->)指针运算符

struct empInfo
{
 unsigned char name[20];
 unsigned int empId;
 double  salary;
}emp;
 
或者
struct empInfo 
{ 
  unsigned char name[20]; 
  unsigned int empId; 
  double salary; 
};
struct empInfo *emp;

请注意与前面例子的区别,在这里emp是指向empInfo的指针变量。

  • emp->name = const_value1
  • emp->empId = const_value2
  • emp->salary = const_value3

例程:

#include <stdio.h>
 
struct empInfo
{
 unsigned char name[20];
 unsigned int  empId;
 double        salary;
};
 
 
int main() 
{
    struct empInfo emp={"John",12345,89999.466};
    
    printf("Size of structure empInfo is =%lu\n",sizeof(struct empInfo));
    
    printf("Value at structure members are :\n");
    
    printf("emp.name=%s\n",emp.name);
    
    printf("emp.empId=%u\n",emp.empId);
    
    printf("emp.salary=%lf\n",emp.salary);
 
    return 0;
}

输出结果:

Size of structure empInfo is =32
Value at structure members are :
emp.name=John
emp.empId=12345
emp.salary=89999.466000

在结构中使用typedef

typedef的作用是为现有数据类型赋予别名。通过使用typedef,我们可以为现有struct数据类型取一个你喜欢的或者你想要的名字。例如:

typedef struct
{
 unsigned char name[20];
 unsigned int empId;
 double  salary;
}empInfo;
 
/* 在这里,结构体的别名就是empInfo.即struct = empInfo*/
 
empInfo emp; 

程序:
让我们在上面的示例中应用typedef

#include <stdio.h>
#include<string.h>
 
typedef struct
{
 unsigned char name[20];
 unsigned int empId;
 double  salary;
}empInfo;
 
/* 在这里,结构体的别名就是empInfo.即struct = empInfo*/
 
int main() 
{
    empInfo emp={"John",12345,89999.466};  /*empInfo is the alias name of struct*/
    
    printf("Size of structure empInfo is =%lu\n",sizeof(empInfo));
    
    printf("Value at structure members are :\n");
    
    printf("emp.name=%s\n",emp.name);
    
    printf("emp.empId=%u\n",emp.empId);
    
    printf("emp.salary=%lf\n",emp.salary);
 
    return 0;
}

输出结果:

Size of structure empInfo is =32
Value at structure memebrs are :
emp.name=John
emp.empId=12345
emp.salary=89999.466000

结构体嵌套

结构体嵌套是指在结构体内部再使用结构体。
例如:

typedef struct 
{
 unsigned char date;
 unsigned char month;
 unsigned char year;
}empBday;
 
struct empInfo 
{ 
  unsigned char name[20];
  empBday bday;           /*nested structure*/
  unsigned int empId; 
  double salary; 
};

在上面的结构empBday中 ,它本身就是一个结构,是另一个名为empInfo的结构的成员。此过程称为结构体嵌套。

例如:

#include <stdio.h>
typedef struct 
{
 unsigned char date;
 unsigned char month;
 unsigned char year;
}empBday;
 
struct empInfo 
{ 
  unsigned char name[20];
  empBday bday;           /*nested structure*/
  unsigned int empId; 
  double salary; 
}; 
int main() 
{
    struct empInfo emp={"孙悟空",{18,10,88},3800209,80000};
    printf("Name=%s\t",emp.name);
    printf("Bday=%u-%u-%u\t",emp.bday.date,emp.bday.month,emp.bday.year);
    printf("empId=%u\t",emp.empId);
    printf("Salary=%lf\n",emp.salary);
    return 0;
}

输出结果:

Name=孙悟空 Bday=18-10-88 empId=3800209 Salary=80000.000000

下一节