下面先举一个例子
例1:
# include <stdio.h> struct Student { int age; char sex; char name[100]; }; //分号不能省 int main(void) { struct Student st = {20, 'M', "张三"}; struct Student * pst = &st; printf("%d %c %s\n", st.age, st.sex, st.name); printf("%d %c %s\n", pst->age, pst->sex, pst->name); //pst->age 转化成 (*pst).age 等价于 st.age return 0; }
输出结果为:
在上个博客中,没有说到结构体中的字符串,这次说明一下,字符串需要用一个字符数组表示,而给它赋予字符串,如果不用上面的那样情况(即定义结构体变量的同时被赋予内容),就需要用到一个函数,下面会举例说一下
例2:
# include <stdio.h> # include <string.h> struct Student { int age; char sex; char name[100]; }; //分号不能省 void InputStudent(struct Student *); void OutputStudent(struct Student ss); int main(void) { struct Student st; //15行 InputStudent(&st); //17行 OutputStudent(st); //18行 return 0; } void OutputStudent(struct Student ss) //23行 { printf("%d %c %s\n", ss.age, ss.sex, ss.name); } void InputStudent(struct Student * pstu) //pstu只占4个字节 { (*pstu).age = 10; strcpy(pstu->name, "张三"); //31行 pstu->sex = 'M'; } /* void InputStudent(struct Student stu) //36行 { stu.age = 10; strcpy(stu.name, "张三"); //不能写成 stu.name = "张三"; //39行 stu.sex = 'M'; } */输出结果为:
17行是对结构体变量输入,必须发送st的地址,18行对结构体变量输出 ,可以发送st的地址,也可以直接发送st的内容(但是推荐使用发送地址的方式,原因下面会说明)
而从37行开始的函数不能修改15行st的值,所以说这个函数是错误的,原因不说了,这个在关于指针里边说过。
31行和39行,在对字符数组进行赋予内容时,使用了strcpy函数,这个函数的意思是string copy,即给字符数组赋予字符串,当然,使用这个函数时必须在程序的上方加上 # include <string.h>
下面说一下为什么推荐使用发送地址的方式传递内容
指针的优点之一:
快速的传递数据,
耗用内存小
执行速度快
对结构体变量输出,可以发送st的地址,也可以直接发送st的内容 但为了减少内存的耗费,也为了提高执行速度,推荐发送地址
所以,例2的18行、23行代码最好像例3的19行、24行这样写
例3:
# include <stdio.h> # include <string.h> struct Student //4行 { int age; char sex; char name[100]; }; //分号不能省 9行 void InputStudent(struct Student *); void OutputStudent(struct Student *); int main(void) { struct Student st ; //15行 //printf("%d\n", sizeof(st)); //16行 InputStudent(&st); //对结构体变量输入 必须发送st的地址 OutputStudent(&st); //19行 return 0; } void OutputStudent(struct Student *pst) //24行 { printf("%d %c %s\n", pst->age, pst->sex, pst->name); } void InputStudent(struct Student * pstu) //pstu只占4个字节 { (*pstu).age = 10; strcpy(pstu->name, "张三"); pstu->sex = 'M'; }
输出结果为:
而且,对于本程序的19行,使用指针变量传送地址,,而指针变量只占4个字节,如果是传送内容,我们看4行到9行的结构体类型占的内存大小,一个int型数据占4个字节(在这里,之所以说在这里,是因为int不一定在任何地方都是占4个字节,当然,大多数情况下都是占4个字节),一个char行数据占一个字节,100个char行数据的数组占100个字节,总共105个字节(实际上一般也不会只占105个字节,因为计算机存储数据时,有机器对齐和填充数字的情况,这需要计算机组成原理的知识,这里不多做说明),我们可以把上面代码的第16行前面的注释去掉,这时输出的结果为:
结果是占108个字节
结构体变量的运算
结构体变量不能相加,不能相减,也不能互相乘除
但结构体变量可以相互赋值
例子:
struct Student { int age; char sex; char name[100]; };//分号不能省 struct Student st1, st2; st1+st2 st1*st2 st1/st2 都是错误的 st1 = st2 或者 st2 = st1 都是正确的
【所有代码均在windows系统下VC++6.0下运行通过】
(如有错误,敬请指正)