结构体
声明结构体:
struct 结构体名
例如:struct student 其中,student又称为结构体标记
结构体可以拥有成员,例如:
struct student
{
int num;
int score;
char name[20]
}; 注意,分号不可以少!
定义结构体变量
1、在声明类型的同时声明变量
struct student
{
int num;
int score;
char name[20]
}a,b;
2、不指定类型名定义变量(用的不多)
例如:
struct
{
int ……
}a,b;
注意:(1)结构体类型中的成员名可以与程序中的变量名相同,但二者不代表同一对象。例如,程序中可以另定义一个变量num,它与struct Student中的num是两回事,互不干扰。
结构体初始化与引用
例如:struct student
{int……}
a={100,“hello”……};
可以引用结构体变量中成员的值,引用方式为
结构体变量名 成员名
例如:a.num=100;
注意:不能企图通过输出结构体变量名来达到输出结构体变量所有成员的值。
(1)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。如果在结构体 struct Student类型的成员中包含另一个结构体struct date类型的成员birthday,则引用成员的方式:
Sudent,num;
student.birthday.year:不能用a.birthday来访问变量中的成员birthday,因为birthday本身就是一个结构体变量!
(2)对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如:
student2.score= student1. score;(赋值运算)
sum=student1. score+student2. score;(加法运算)
student1.age++;(自加运算)
由于“.”运算符的优先级最高,因此student1.age++是对(student1.age)进行自加运算,而不是先对age进行自加运算。
(3)同类的结构体变量可以互相赋值,如:student1=student2;//假设student1和 student2已定义为同类型的结构体变量,这是整体赋值!
(4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如:scanf(" %d",&student1. num);
(输入student1.num的值)
printf(" %o",&student1);
(输出结构体变量student1的起始地址)
但不能用以下语句整体读入结构体变量,例如:scanf("%d,%s%c.%d,%f,%s\n",&student1);
结构体数组
一个结构体变量中可以存放一组有关联的数据(如一个学生的学号、姓名、成绩等数据)。如果有10个学生的数据需要参加运算,显然应该用数组,这就是结构体数组。
(1)定义结构体数组一般形式是
struct 结构体名
{成员表列}数组名[数组长度];
先声明一个结构体类型(如struct Person),然后再用此类型定义结构体数组:结构体类型数组名[数组长度];
如:
struct Person leader[3];
//leader是结构体数组名
(2)对结构体数组初始化的形式是在定义数组的后面加上:
={初值表列};
如:
struct stu
{
int num;
char name[20];
char sex;
float score;
}student[2]={{1,”li”,’m’,60},{2,”ai”,’f’,100}};
3、定义结构体之后赋值,可利用for循环结构:
例如:struct stu
{
int num;int chinese
};
int main()
{
struct stu student[5];
......
for(i=0;i<5;i++)
{
scanf_s("%d%d",&stduent[i].num,&student[i].chinese);
}
}
指向结构体的指针
一个结构体变量的指针就是该变量所占内存空间的首地址,通过结构体指针变量即可访问到该结构体变量。
结构体指针变量定义的一般形式为:
struct 结构体名 *结构体指针变量名
如要说明一个指向student的指针变量p:struct student *p
或是struct date
{int tear,month,day;}*q;
注意,结构体变量也必须先赋值后才能使用,赋值是把结构体变量的首地址赋予该指针变量,不能把结构体名赋给它,例如:
struct student stu;
则 p=&stu 是正确的,注意不能写成p=&student,这是错误的
结构体成员的三种引用方式
(*结构体指针变量).成员名
或者
结构体指针变量->成员名
如以下程序:
struct code
{
int n;char c;
}a,*p;
p=&a;
p是指向a的结构体指针,对于变量a中的成员又三种引用方式:
(1)a.n、a.c
(2)(*p).n、(*p).c:注意括号不可以少!
(3)p->n、p->c:等价为第二种形式, ->优先级为1级
注意,p->n++等价于(p->n)++,是先取成员n的值,再使n加一
++p->n等价于++(p->n),是先对n加一,再取n的值。
结构体数组的指针
结构体变量作函数的参数
#include<stdio.h>
struct s
{
int chinese;
int maths;
};
int print(struct s y)
{
printf("Chinese=%d\tmaths=%d", y.chinese, y.maths);
}
int main()
{
struct s x;
scanf_s("%d%d", &x.chinese, &x.maths);
print(x);
return 0;
}
结构体数组作函数参数:
#include<stdio.h>
struct stu
{
int num;
int score[3];
};
int count(struct stu s[], int n)//结构体数组作形参
{
int i, j, c = 0, flag;
printf("number is:\n");
for (i = 0; i < n; i++)
{
flag = 0;
for(j=0;j<3;j++)
if (s[i].score[j] < 60)
{
flag = 1;
break;
}
if (flag == 1)
{
c++;
printf("%d\n", s[i].num);
}
}
return c;
}
int main()
{
int c;
struct stu a[5] = { {1001,67,56,78},{1002,78,78,90},{1003,67,85,45},{1004,89,67,89},{1005,83,92,99} };
c = count(a, 5);
printf("nopass is:%d\n", c);
return 0;
}
3、指向结构体的指针作函数参数、