C语言中的结构体

结构体:一种自己设计的全新数据类型,没有方法的类

  • 如果没有选择使用标记名(emplopee),那么只能在定义时声明
  • 在声明时编译器不为结构保留任何内存空间,而是建立了用于声明变量的一种新的数据类型
  • 如果初始化的值的个数小于结构体中的成员数目,剩下的初始化为0(指针为NULL
  • 可以使用同种类型的其他结构变量进行赋值(必须要相同类型)
/* 声明一种新类型: employee*/
struct employee {
    char name[50]; 
    int age; 
    float salary; 
}; //别忘记‘;’

struct employee x;          //声明emplyee结构体类型的变量
x = {"Simon", 18, 200}; //初始化


访问结构体的成员变量

  • .是直接访问,而不是指针(结构体在内存中连续存储)
struct employee x, y;

strcpy(x . name, "Norma Baker"); 
x.age = 34; 
scanf("%f", &x.salary);

strcpy(y.name, "Robert Smith"); 
y.age = x.age + 5; 
y.salary = 0.90 * x.salary;


结构体数组

struct employee {
    char name[25]; 
    int age; 
    float salary; 
}; 
struct employee toy_dept[100];

//访问数组元素
toy_dept[i].salary = 70000.0; 
strcpy(toy_dept[i].name, "Adam Smith"); 
scanf ("%d", &toy_dept[i].age);


结构体作为函数参数

struct Books { 
    char title[50]; 
    char author[50]; 
} book;

/* function declaration */ 
void printBook( struct Books book );


结构体指针

struct Books { 
    char title[50]; 
    char author[50];
} book1; 

struct Books *struct_pointer; 
struct_pointer = &book1;

//直接访问
printf("Book title : %s\n", (*struct_pointer).title);
//通过指针访问
printf( "Book title : %s\n", struct_pointer->title);


结构体中的Union(联合)

  • 结构的各成员顺序排列存储,每个成员都有自己独立的存储位置,但Union变量的所有成员共享同片内存
  • Union变量每个时刻里只能保存它的某一个成员的值
enum fig_type { CIRCLE, RECTANGLE, TRIANGLE } ;
struct figure { 
    double area, perimeter; //都有的属性
    perimeter; 
    enum fig_type ins; 
    union { 
        double radius;          //圆特有的属性
        double a[2];                //矩形特有的属性
        double b[3];                //三角形特有的属性
        } param; 
} fig1, fig2 ;

fig1.param.a[] = {2.0,3.0}; 
fig2.param.radius = 2.0;


typedef

typedef double * MATH; /* MATH – doubel指针 */

typedef char NAME[50];  
NAME person; /* char person[50]; */


typedef struct employee EmpRec; /* EmpRec - employee结构体 */
EmpRec x, y;


内存中的存储

struct example {
    char c;
    int b;
} sample;
内存存储.png
  • 字长为两个字节的计算机可能会要求把sample的每一个成员从的边界开始存放(字:存储数据的标准内存单元),这个特性和机器有关
  • 可能会有空洞存在在内存中(空洞中的值不确定),图中有一个字节的空洞
  • 所以结构体不能比较大小(空洞存在)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容