C语言编程精解-(8)-结构体和联合体

  • 是否可以在结构体或联合体中定义一个函数?
  • 何时为结构体分配内存?
  • 结构体变量是否可以当左值来处理?

结构体和联合体

1.程序 声明并初始化结构体

// 使用结构体显示电子账单
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]){
    // 创建一个结构体
    struct ebill{
        int mno;
        char name[20];
        int previous;
        int present;
        int units;
        float charge;
    };
    // 声明ebill类型变量eb
    struct ebill eb;

    // 将数据存储到结构体变量的数据成员中
    eb.mno = 1005;
    strcpy(eb.name, "Raj Kumar");
    eb.previous = 500;
    eb.present = 750;
    eb.units = eb.present - eb.previous;
    eb.charge = eb.units*4.50;

    // 从结构体实例中读取并显示数据
    printf("Meter no: %d\n",eb.mno);
    printf("Customer name: %s\n",eb.name);
    printf("Previous reading: %d\n",eb.previous);
    printf("Present reading: %d\n",eb.present);
    printf("Total units: %d\n",eb.units);
    printf("Total charge: %8.2f\n",eb.charge);
}

输出:

Meter no: 1005
Customer name: Raj Kumar
Previous reading: 500
Present reading: 750
Total units: 250
Total charge:  1125.00

2.程序 结构体指针

// 使用结构体指针访问和显示结构体实列的数据成员
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]){
    // 创建一个结构体
    struct ebill{
        int mno;
        char name[20];
        int previous;
        int present;
        int units;
        float charge;
    };
    // 声明一个结构体指针
    struct ebill *ptr = NULL;

    // 使用->操作符向结构体传值
    ptr->mno = 1005;
    strcpy(ptr->name, "Raj Kumar");
    ptr->previous = 500;
    ptr->present = 750;
    ptr->units = ptr->present - ptr->previous;
    ptr->charge = ptr->units*4.50;

    // 使用->从结构体实例中读取并显示数据
    printf("Meter no: %d\n",ptr->mno);
    printf("Customer name: %s\n",ptr->name);
    printf("Previous reading: %d\n",ptr->previous);
    printf("Present reading: %d\n",ptr->present);
    printf("Total units: %d\n",ptr->units);
    printf("Total charge: %8.2f\n",ptr->charge);
}

输出:

Meter no: 1005
Customer name: Raj Kumar
Previous reading: 500
Present reading: 750
Total units: 250
Total charge:  1125.00

3.程序向函数传递结构体参数

// 使用结构体变量向函数传递参数
#include <stdio.h>
#include <string.h>
// 全局声明一个结构体
struct student{
    int rno;
    char name[20];
};

// 用于显示结构体的函数
void display(struct student st);
int main(int argc, const char * argv[]){
    // 声明结构体变量
    struct student s;

    // 存储数据至结构体成员变量
    s.rno = 10;
    strcpy(s.name, "Priya");
    // 调用函数,传递结构体变量
    display(s);
}

// 用于显示结构体成员的函数
void display(struct student st){
    printf("rno = %d\n",st.rno);
    printf("Name = %s\n",st.name);
}

输出:

rno = 10
Name = Priya

4.程序 结构体指针传参

// 使用结构体变量向函数传递参数
#include <stdio.h>
#include <string.h>
// 全局声明一个结构体
struct student{
    int rno;
    char name[20];
};

// 用于显示结构体的函数
void display(struct student *ptr);
int main(int argc, const char * argv[]){
    // 声明结构体变量
    struct student *s;

    // 存储数据至结构体成员变量
    s->rno = 10;
    strcpy(s->name, "Priya");
    // 调用函数,传递结构体变量
    display(s);
}

// 用于显示结构体成员的函数
void display(struct student *ptr){
    printf("rno = %d\n",ptr->rno);
    printf("Name = %s\n",ptr->name);
}

5.程序 拷贝结构体变量

// 将一个结构体变量的数据拷贝到另一个结构体中
#include <stdio.h>
int main(int argc, const char * argv[]){
    // 定义结构体
    struct employee{
        int id;
        char name[20];
    };
    // 初始化e1
    struct employee e1 = {10,"Venu"};
    // e2也是结构体变量
    struct employee e2;
    // 讲e1n的内容拷贝至e2
    e2 = e1;

    // 显示
    printf("Id = %d\n",e2.id);
    printf("Name = %s\n",e2.name);
}

输出:

// 将一个结构体变量的数据拷贝到另一个结构体中
#include <stdio.h>
int main(int argc, const char * argv[]){
    // 定义结构体
    struct employee{
        int id;
        char name[20];
    };
    // 初始化e1
    struct employee e1 = {10,"Venu"};
    // e2也是结构体变量
    struct employee e2;
    // 讲e1n的内容拷贝至e2
    e2 = e1;

    // 显示
    printf("Id = %d\n",e2.id);
    printf("Name = %s\n",e2.name);

}

6.程序 嵌套结构体

// 嵌套结构体
#include <stdio.h>
// 存储生日信息
struct dob{
    int dd;
    int mm;
    int yy;
};

// 存储雇员数据
struct employee{
    int id;
    char name[20];
    struct dob d;   // d是一个dob结构体变量
};

int main(int argc, const char * argv[]){
    struct employee e;

    printf("Enter employee id: \n");
    scanf("%d",&e.id);
    fflush(stdin);

    printf("Enter employee name: \n");
    gets(e.name);
    printf("Enter date of birth (dd/mm/yyyy): \n");
    scanf("%d%d%d",&e.d.dd,&e.d.mm,&e.d.yy);

    printf("Id = %d\n",e.id);
    printf("Name = %s\n",e.name);
    printf("Date of birth: %d/%d/%d\n",e.d.dd,e.d.mm,e.d.yy);
}

输出:

Enter employee id: 
1001
Enter employee name: DaWei
Enter date of birth (dd/mm/yyyy): 
22/06/1988
Id = 1001
Name = DaWei
Date of birth: 22/06/1988

6.程序 查找系统日期和时间

// 联合体的行为
#include <stdio.h>
int main(int argc, const char * argv[]){
    // 定义一个联合体
    union mixed{
        char ch;
        int in;
    };
    // 声明联合体变量u
    union mixed u;
    // 将字符A保存至u的数据成员ch中
    u.ch = 'A';
    // 显示该联合体实例的两个数据成员
    printf("ch value = %c\n",u.ch);
    printf("in value = %i\n",u.in);
}

输出:

ch value = A
in value = 65

7.重要的面试题

何时为结构体分配内存?
答:声明结构体类型时并不会为结构体分配内存,只有当声明结构体变量时才会为其分配内存.

8.重要的面试题

结构体和数组有什么区别?
答:数组只能存储同一类型的数据,结构体可以存储不同类型的数据;
如果将一个数组的元素拷贝至另外一个数组,则需要逐个元素拷贝,而讲一个结构体实列中的数据拷贝至另外一个结构体实列,只需要逐个拷贝或直接将结构体变量赋值给另外一个结构体变量.

9.重要的面试题

结构体变量是否可以当左值来处理?
答:可以,当表达式左边变量为结构体变量是,例如,

struct dob{
    int dd;
    int mm;
    int yy;
};

现在,我们写下这行代码:

date1 = data2;

变量date2中date,month,year数据都会被赋给date1相关数据元素.因此结构体既可以当成左值,也可以是右值.

10.重要的面试题

是否可以在结构体或联合体中定义一个函数?
答:不可以,在结构体或联合体中定义一个函数,但是可以在结构体或联合体的定义中声明一个函数指针数据成员,该函数指针可以调用一个在结构体或联合体外定义的函数.


 上一篇
C语言编程精解-(9)-宏与枚举 C语言编程精解-(9)-宏与枚举
什么是预处理,什么是宏? 什么是内联操作? 枚举与数组结合. 宏与枚举1.重要的面试题什么是预处理,什么是宏?答:预处理是C编译器的一个组件,用于处理在实际编译动作发生之q ai的头文件包含或宏处理等任务;宏是一个记号,用来代表一个常
2019-03-22
下一篇 
C语言编程精解-(7)-指针2 C语言编程精解-(7)-指针2
如何使用指针数组来表示一组字符串? 使用指针实现了一个参数和返回值q均为字符串的函数. 指针1.程序 使用指针实现了一个参数和返回值q均为字符串的函数// 使用指针实现了一个参数和返回值q均为字符串的函数 #include <s
2019-03-19
  目录