目录
一.结构体类型的声明
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构的成员可以是标量、数组、指针,甚至是其他结构体。例如定义一名学生的信息:#include<stdio.h> typedef struct Stu //typedef可以省略,struct不能随便省略 { char name[20];//名字 int age;//年龄 char sex[5];//性别 char id[20];//学号 }Stu; //变量列表 int main() { struct Stu s1; struct Stu s2; Stu s3; return 0; }
二.结构体变量的定义和初始化
struct Point
{
int x;
int y;
}p1={21,14};//定义变量的同时赋初值.
struct X
{
char c;
struct Point p;
double d;
char arr[21];
};
int main ()
{
struct Point p={100,23};
struct X sx={ 'x',{12,23},3.14,"hello"};
return 0;
}
三.结构体成员的访问,结构体传参
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。#include<stdio.h> struct Point { int x; int y; }p1={21,14}; struct X { char c; struct Point p; double d; char arr[21]; }; int main () { struct Point p={100,23}; struct X sx={ 'x',{12,23},3.14,"hello"}; printf("%c\n",sx.c); printf("%d %d\n",sx.p1.x,sx.p1.y); printf("%lf\n",sx.d); printf("%s\n",sx.arr); return 0; }
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。#include<stdio.h> struct Point { int x; int y; }p1={21,14}; struct X { char c; struct Point p1; double d; char arr[21]; }; // void print1(struct X s) // { // printf("%c\n",s.c); // printf("%d %d\n",s.p1.x,s.p1.y); // printf("%lf\n",s.d); // printf("%s\n",s.arr); // } void print2(struct X* ps) { printf("%c\n",ps->c); printf("%d\n",ps->p1.x,ps->p1.y); printf("%lf\n",ps->d); printf("%s\n",ps->arr); } int main () { struct Point p={100,23}; struct X sx={ 'x',{12,23},3.14,"hello"}; //如果想修改信息 //sx.c='d'; //这样即可 // print1(sx); // 打印struct X类型的变量 print2(&sx); return 0; }
上面的 print1 和 print2 函数哪个好些?答案是:首选 print2 函数。原因:函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。结论:结构体传参的时候,要传结构体的地址。