结构体和数组都是构造类型的一种.
作为函数参数形参时: 数组传递是原数组的地址, 结构体(结构体非const指针 除外)传的是实际的数值并给了新的变量.
数组中所有元素都是同一数据类型,结构体中的成员的数据类型可以相同也可不同.
1.结构体的一般定义
(一)
#include<stdio.h>
int main()
{
}
//结构体定义
struct {
//成员列表
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}sudent1,student2; //变量名列表,定义结构体变量
(二)
#include<stdio.h>
int main()
{
}
//结构体定义
struct student{
//成员列表
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}sudent1,student2; //变量名列表,定义结构体变量
(三)
#include<stdio.h>
int main()
{
}
//结构体类型声明
struct student{
//成员列表
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
//定义结构体类型变量
struct student student1;
struct student student2;
(四)
#include<stdio.h>
int main()
{
}
struct date{
int month;
int day;
int year;
};
struct student{
int num;
char name[20];
char sex;
int age;
struct date birthday;
float score;
char addr[30];
};
struct student student1;
struct student student2;
2.结构体变量的引用(结构体变量名.成员名)
#include<stdio.h>
struct date{
int month;
int day;
int year;
};
struct student{
int num;
char name[20];
char sex;
int age;
struct date birthday;
float score;
char addr[30];
};
struct student student1;
struct student student2;
int main()
{
printf("%d \n",sizeof(struct student));//struct student长度
student1.num=1;// "." 成员运算符,高运算优先级
student1.birthday.year=1;
printf(
"%d %d\n",
student1.num,
student1.birthday.year);
}
start without debugging
3.结构体变量地址
结构体变量的地址 和 本结构体变量的第一个成员地址相同(类似数组)
#include<stdio.h>
struct date{
int month;
int day;
int year;
};
struct student{
int num;
char name[20];
char sex;
int age;
struct date birthday;
float score;
char addr[30];
};
struct student student1;
struct student student2;
int main()
{
student1.num=1;
student1.birthday.year=1;
printf(
"%d %d\n",
&student1.num,
&student1);
}
start without debugging
3.1结构体变量的初始化
#include<stdio.h>
struct {
int num;
char name[20];
}student1,student2={1,"xxx"};//结构体变量student2初始化
int main()
{
printf("%d %s \n",student2.num,student2.name);
student1=student2;//结构体变量s...2赋值给结构体变量s..1
printf("%d %s \n",student2.num,student2.name);
}
start without debugging
4. 结构体数组 定义
#include<stdio.h>
struct {
char name[10];
char num[3];
}person[2];//结构体数组 定义
int main()
{
int i;
for(i=0;i<2;i++)
{
puts("input name:");
gets(person[i].name);
puts("input num:");
gets(person[i].num);
}
puts("\tname\t\t\t\t\tnum\n");
for(i=0;i<2;i++)
{
printf("%20s\t\t\t%20s\n",person[i].name,person[i].num);
//%20s右对齐输出字符串,左边补空格,单行占20
}
}
4.1 结构体数组定义并初始化
#include<stdio.h>
struct {
char name[10];
char num[3];
}person[2]={{"a","1"},{"b","2"}};//结构体数组定义时初始化
int main()
{
int i;
puts("\tname\t\t\t\t\tnum\n");
for(i=0;i<2;i++)
{
printf("%20s\t\t\t%20s\n",person[i].name,person[i].num);
}
}
5.结构体类型指针
#include<stdio.h>
struct stu{
char name[10];
char num[3];
}person={"a","1"};
int main()
{
struct stu *per;
//定义结构体类型指针:指向结构体类型struct stu
per=&person;//结构体变量地址赋值给指针
puts("\tname\t\t\t\t\tnum\n");
printf("%20s\t\t\t%20s\n",person.name,person.num);
printf("%20s\t\t\t%20s\n",(*per).name,per->num);
//两种方式,注意方式(*per).name中的括号必须要有,因为 . 运算符的运算优先级比 * 高
//用指针引用变量中的成员
}
6.结构体做函数参数
6.1结构体变量做函数参数
#include<stdio.h>
#include<string.h>
struct stu{
char name[5];
int num;
float score[2];
};
int main()
{
int print1(struct stu a);
struct stu one;
one.num=8;
strcpy(one.name,"abc");//易错处
one.score[0]=8;
one.score[1]=9;
print1(one);//结构体变量做实参
}
int print1(struct stu a)//结构体变量做形参
{
printf("%d \n",a.num);
printf("%s \n",a.name);
printf("%f %f \n",a.score[0],a.score[1]);
}
#include<stdio.h>
struct stu{
char *name;
int num;
float score[2];
};
int main()
{
int print1(struct stu a);
struct stu one;
one.num=8;
one.name="abc";
one.score[0]=8;
one.score[1]=9;
print1(one);//结构体变量做实参
}
int print1(struct stu a)//结构体变量做形参
{
printf("%d \n",a.num);
printf("%s \n",a.name);
printf("%f %f \n",a.score[0],a.score[1]);
}
6.2结构体类型指针做函数参数
#include<stdio.h>
struct stu{
char *name;
int num;
float score[2];
};
int main()
{
int print1(struct stu *a);
struct stu one;
one.num=8;
one.name="abc";
one.score[0]=8;
one.score[1]=9;
print1(&one);//结构体变量做实参
}
int print1(struct stu *a)//结构体变量做形参
{
printf("重新输入一个编号(int): ");
scanf("%d",&a->num );//易错处
printf("%d \n",a->num);
printf("%s \n",(*a).name);
printf("%f %f \n",(*a).score[0],a->score[1]);
}