C语言学习笔记:结构体

结构体与结构体变量

  • 结构声明
    在声明结构时,必须列出它包含的所有成员。这个列表包括每个成员的类型和名字。结构中至少要包含两个成员(结构标签的不完整声明是个例外)。
struct tag {member-list} varibale-lst;
  • 创建结构体和结构体变量
struct
{
	int a;
	float b;
	char c;
}x,y;//创建了结构体变量x,y,变量包含三个成员:整数、浮点数、字符

也可以这样创建结构体变量

struct name
{
	int a;
	float b;
	char c;
};//创建了结构体name	
struct name x,y;//创建了结构体变量x,y
  • 应用示例
    先输入n,再输入n个学生的名字和成绩,按分数从高到低输出学生的名字
#include 
struct student//创建了一个名为student的数据类型
{
	int score;
 	char name[21];
};//这个分号不可省略
int main()
{
 	int i,j,n;
 	struct student a[1000],t;//a[1000]中的变量和t是student类型的变量,
 	scanf("%d",&n);
 	for(i=1;i<=n;i++) 
	scanf("%s %d",a[i].name,&a[i].score);
 	for(i=1;i<=n;i++){
  	   for(j=1;j<=n-i;j++){
   	      if(a[j].score<a[j+1].score){
   		  t=a[j];
    		  a[j]=a[j+1];
    		  a[j+1]=t;
   		}
  	    }
 	}
 	for(i=1;i<=n;i++)
  	printf("%s %d\n",a[i].name,a[i].score);
}

向函数传递结构的信息

  • 传递结构成员
    只要结构成员是一个具有单个值的数据类型,就可以把它作为参数传递给接受该特定类型的函数。

    因为函数并不知道也不关心实参是否是结构的成员,只要求传入的数据类型是该函数接收的。

  • 传递结构的地址
    注意必须使用&运算符来获取结构的地址。

  • 传递结构
    对于允许把结构作为参数的编译器可行。
    用结构作为函数参数,调用函数时,编译器根据结构模板创建了同名的自动结构体变量,该结构的各成员被初始化为该函数参数结构变量相应成员的值的副本。
    意思就是说,函数并没改变结构参数本身,返回的结构参数是该结构参数的副本被相应改变后的值。

指向结构的指针

  • 为什么要使用指向结构的指针?

1、指向结构的指针通常比结构本身更容易操控。
2、早期C实现中,结构不能作为参数传递给函数,但是可以传递指向结构的指针。
3、即使能传递一个结构,传递指针通常更有效率。
4、一些用于表示数据的结构中包含指向其他结构的指针。

  • 声明和初始化结构指针
    假定我们创建了一个结构体
struct student
{
	int score;
	char grade;
};	

声明结构指针:

struct student *p;//指针p可以指向任意现有的student类型的结构

例如,mike是一个student类型的变量,可以这样写:

p = &mike;

和数组不同,结构变量名并不是结构的地址,因此要在结构变量名前面加上&运算符

  • 用指针访问成员

指针p指向结构变量mike,如何通过p获得mike的值?

第一种方法,使用 -> 运算符

如果 p == &mike,那么 p -> score 即是 mike.score

第二种方法,利用&与*是互逆运算符

因为 *p == mike,所以(*p).score 即是 mike.score

你可能感兴趣的:(C语言学习笔记:结构体)