结构体数组
所谓结构体数组就是数组里每个元素都是一个结构体。
定义一个结构体数组和定义结构体变量的方式差不多:
struct stu{
char*name;
int age;
char group;
int num;
float score;
}class[5];
结构体数组在定义时也可以顺便初始化,当给所有值赋值后,可以不写出数组长度。
结构体数组的使用
class[0].age;
修改值
class[0].group=‘D’;
结构体和指针
指针可以指向结构体,格式:
struct 结构体名字 * 变量名;
例如:
struct stu{
char*name;
int age;
int num;
char group;
float score;
}stu1,*ptr=&stu1;
注意:结构体变量名和数组名不同,数组名在表达式中会被转化成数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&!还应该注意,结构体和结构体变量是两个不同的概念,结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像int、float等关键字本身不占内存;结构体变量才包含实实在在的数据,才需要内存来存储。所以,下面的写法是错误的,不可能去取得一个结构体名的地址,也不能将它赋值给其他变量:
struct stu* ptr=&stu;
struct stu*ptr=stu;
通过指针获取结构体成员
- (*pointer).memberName;
- pointer->memberName;
第一种写法中,.的优先级高于*,(*pointer)两边的括号不能少,如果去掉括号,那么这样的意义就完全不对。
第二种写法,->是一个新的运算符,有了它,可以通过结构体指针直接取得结构体成员,这也是->
在c语言中的唯一用途。
结构体指针作为函数参数
结构体变量名代表的是整个集合本身,作为函数参数传递的是一整个集合,也就是全部成员,而不是像数组一样被编译器转化成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间的开销就很大,影响程序的运行效率。所以最好的办法是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。
例如:
void average(struct stu*ptr,int n );