前言:
这里我们接着上一章 更加详细的去学习探索C的特色“结构体”
1. 初始化、引用结构体变量
(1)结构体变量初始化
在c语言中,结构体变量初始化,本质是对结构体变量中的成员进行初始化,使用 花括号{} 在初始化列表中对结构体变量中各个成员进行初始化,例如:
struct Employee emp = {“rupeng”,20,1,10000}
或
struct Employee
{
char name [8];
int age;
int id;
int salary;
} emp = {“rupeng”,20,1,10000};
编译器会将“rupeng”,20,1,10000按照顺序依次赋值给结构体变量emp中的成员:name、
age、id、salary
(2)引用结构体变量
引用结构体变量的本质,是引用结构体变量中的不同类型的成员,引用的一般形式为:结构体变量名、成员名。
例如:emp.name表示引用emp变量中的name成员,emp.id表示引用emp 变量中的id成员。
其中“.”是成员运算符,它的优先级在所有运算符中最高的。
例:
include <stdio.h>
struct Employee
{
char name[20];
int age;
int height;
int salary;
}; //这里的‘;’必须要加上
int main ()
{
struct Employee e1={“yzk”,18,1,80000};
printf(“姓名%s,年龄%d,工资%d”,e1.name,e1.age,e1.salary);
getchar ();
return 0;
}
还可以挨个赋值:
不过要再加上头文件 include <string.h>,因为字符串无法直接赋值
int main()
{
struct Employee e1;
strcpy(e1.name,”yzk”); //将字符串变量,打印到某个变量中
e1.age = 18;
e1.height = 1;
e1.salary = 80000;
}
2. 机构体指针
指向和结构图的指针 就是 机构体指针,如果指针变量中保存一个机构体变量的地址,则这个指针变量指向该结构体变量,需要注意的是指针变量的类型必须和结构体变量的类型相同。
定义结构体指针变量的一般形式为:
struct Employee;
struct Employee *p_emp = &emp;
其中emp为结构体变量,p_emp为结构体指针,将emp取地址赋给指针变量p_emp,表示p_emp指向emp。
在c语言中,通过结构体指针p也可以语言结构体的成员,有以下两种方式:
(1)(*p).成员名
(2)p -> 成员名
例如:struct Employee *p_emp = &emp;
(*p_emp)表示指向的结构体变量emp,(*p_emp).age表示指向的结构体变量emp中的成员age。注意:“.”运算符优先级是最高的,(*p_emp)两侧的括号不能省去。
为了简化操作,c语言允许将 (*p).成员名 用 p->成员名 替换,(*p_emp).age等价于*p_emp->age,“->”称为 指向运算符
例:
include <stdio.h>
struct Employee
{
char name[20];
int age;
int height;
int salary;
};
int main ()
{
struct Employee e1={“yzk”,18,1,80000};
struct Employee *p_e1 = &e1;
printf(“姓名%s,年龄%d,工资%d”,e1.name,e1.age,e1.salary);
printf(“%s,%d\n”,(* p_e1).name, (* p_e1).age); //指针指向打印
printf(“%s,%d\n”, p_e1->name, p_e1->age); //指针指向打印
getchar ();
return 0;
}
3. typedef类型别名
在c语言中,除了使用c语言通过的标准类型名:char、int、double……以及自定义的结构体类型。还可以使用typedef关键字指定一个新的类型名来代替已有的类型名,相当于给已有类型起别名。
类似于现实生活中,给一个人起外号,其实都是一个人。
typedef 的一般使用形式为:
typedef 原类型名 新类型名
例如:
typedef int integer;
其中 integer 是 int 类型的别名,在程序中可以使用 integer 代替 int 来定义整型变量。
例:
integer a,b; 等价于 int a,b;
typedef struct Employee t_Employee;
其中 struct Employee 为自定义结构体类型名,t_Employee 为 struct Employee 的别名,在程序在可以使用t_Employee 替代 struct Employee。
例:
include <stdio.h>
typedef struct Employee t_Employee;
t_Employee
{
char name[20];
int age;
int height;
int salary;
};
int main ()
{
t_Employee e1={“yzk”,18,1,80000};
t_Employee *p_e1 = &e1;
printf(“姓名%s,年龄%d,工资%d”,e1.name,e1.age,e1.salary);
printf(“%s,%d\n”,(* p_e1).name, (* p_e1).age); //指针指向打印
printf(“%s,%d\n”, p_e1->name, p_e1->age); //指针指向打印
getchar ();
return 0;
}
4. 结构体复制
在c语言中,允许 相同类型的结构体变量 之间 相互赋值。
例如:
t_Employee emp = {“rupeng”,20,1,10000};
t_Employee emp2 = emp;
执行 emp2 = emp,会将结构体变量emp各个成员的值原样复制一份到变量emp2各个成员中。和基本类型变量的赋值规则相同,emp2 是 emp 的一个拷贝。这种赋值方式,被称为“结构体复制”。
例:
include <stdio.h>
typedef struct Employee t_Employee;
t_Employee
{
char name[20];
int age;
int height;
int salary;
};
int main ()
{
t_Employee e1 = {“yzk”,18,1,80000};
t_Employee e2 = e1; //把 e1当前的值拷贝一份,赋值给 e2
printf(“姓名%s,年龄%d,工资%d”,e1.name,e1.age,e1.salary);
printf(“姓名%s,年龄%d,工资%d”,e2.name,e2.age,e2.salary);
getchar ();
return 0;
}