C语言 ||结构体数组 结构体和指针

结构体数组

所谓结构体数组就是数组里每个元素都是一个结构体。

定义一个结构体数组和定义结构体变量的方式差不多:

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;

通过指针获取结构体成员

  1. (*pointer).memberName;
  2. pointer->memberName;

第一种写法中,.的优先级高于*,(*pointer)两边的括号不能少,如果去掉括号,那么这样的意义就完全不对。

第二种写法,->是一个新的运算符,有了它,可以通过结构体指针直接取得结构体成员,这也是->
在c语言中的唯一用途。

结构体指针作为函数参数

结构体变量名代表的是整个集合本身,作为函数参数传递的是一整个集合,也就是全部成员,而不是像数组一样被编译器转化成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间的开销就很大,影响程序的运行效率。所以最好的办法是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。

例如:

void average(struct stu*ptr,int n );

猜你喜欢

转载自blog.csdn.net/weixin_44594976/article/details/89278537