struct tag
{
member-list;
}variable-list;
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
描述一个学生:
#include
//描述—个学生:一些数据
//名字
//年龄
//电话
//性别
// struct结构体关键字 stu-结构体标签 struct stu -结构体类型
struct Stu
{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
};
int main()
{
struct Stu s;
return 0;
}
不建议使用全局的结构体变量
//不建议使用全局的结构体变量
#include
struct Stu
{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}s1,s2,s3;//s1,s2,s3 是全局的结构体变量
int main()
{
struct Stu s;//局部变量
return 0;
}
typedef把结构体重新定一个名字
//typedef把结构体重新定一个名字,叫Stu,Stu是一个类型
#include
typedef struct Stu
{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}Stu;
int main()
{
struct Stu s;//局部变量
Stu s2;
return 0;
}
注意
结构的成员可以是标量、数组、指针,甚至是其他结构体。
//初始化
typedef struct Stu
{
//成员变量
char name[20];
short age;
char tele[12];
char sex[5];
}Stu;//声明类型的同时定义变量Stu
int main()
{
Stu s1 = { "张三",20,"20201227","男" }; //初始化:定义变量的同时赋初值
struct Stu s2 = { "茄子",30,"19191919","保密" };//初始化:定义变量的同时赋初值
struct Stu s3; //定义结构体变量s3
return 0;
}
//嵌套结构体
#include
struct S
{
int a;
char c;
char arr[20];
double d;
};
struct T
{
char ch[10];
struct S s;
char* pc;
};
int main()
{
char arr[] = "hello World\n";
struct T t = { "hehe",{100,'w',"hello ygh",3.14},arr };//结构体嵌套初始化
printf("%s \n", t.ch); //hehe
printf("%s\n", t.s.arr); //hello world
printf("%1f\n", t.s.d);//3.14
printf("%s \n", t.pc);//hello bit
return 0;
}
结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数
//打印结构体内容
//结构体变量访问成员 结构变量的成员是通过点操作符(.)访问的。
//点操作符接受两个操作数
#include
struct stu
{
char name[20];
int age;
};
int main()
{
struct stu s = { "zhangsan", 20 };
printf("%s \n", s.name);
printf("%d \n", s.age);
return 0;
}
#include
struct Stu
{
char name[20];
int age;
char tele[12];
char sex[5];
};
/**
* 问题:print1和 print2选哪个好?
* 答案是︰首选print2函数。
*
* 原因︰函数传参的时候,参数是需要压栈的。
* 如果传递一个结构体对象的时候,结构体过大,
* 参数压栈的的系统开销比较大,所以会导致性能的下降。
*
* 结论∶结构体传参的时候,要传结构体的地址。
*/
void Print1(struct Stu tmp) {
printf("name: %s\n", tmp.name);
printf("age:%d\n", tmp.age);
printf("tele: %s \n", tmp.tele);
printf("sex:%s \n", tmp.sex);
}
void Print2(struct Stu* ps) {
printf("name: %s\n", ps->name);
printf("age:%d\n", ps->age);
printf("tele: %s \n", ps->tele);
printf("sex:%s \n", ps->sex);
}
int main()
{
struct Stu s = { "李四",40,"233284780","男" };
//打印结构体数据
Print1(s);
Print2(&s);
return 0;
}
struct student
{
int num ;
char name [32];
float score;
}stu;
则下面的叙述不正确的是:( D )
A. struct是结构体类型的关键字
B. struct student 是用户定义的结构体类型
C. num,score都是结构体成员名
D. stu 是用户定义的结构体类型名
题目名称;
下面程序要求输出结构体中成员a的数据,以下不能填入横线处的内容是( B )
题目名称:
下面程序要求输出结构体中成员a的数据, 以下不能填入横线处的内容是(B)
题目内容:
A. a.a
B. *p.a
C. p->a.
D. (*p).a
#include
struct stu
{
int num;
char name[10];
int age;
};
void fun(struct stu* p)
{
printf("%s\n", (*p).name);
return;
}
int main()
{
struct stu students[3] = {
{9801,"zhang",20},
{9802,"wang",19},
{9803,"zhao",18}
};
fun(students + 1);
return 0;
}
应该用括号括起来(*p).a,优先级问题
不加括号就会变成*(p.a)
下面程序的输出结果是:©
A.zhang
B.zhao
C.wang
D.18
#include
struct stu
{
int num;
char name[10];
int age;
};
void fun(struct stu* p)
{
printf("%s\n", (*p).name);
return;
}
int main()
{
struct stu students[3] = {
{9801,"zhang",20},
{9802,"wang",19},
{9803,"zhao",18}
};
fun(students + 1); //wang
return 0;
}
结构体访问成员的操作符不包含:( D )
题目内容:
A. .操作符
B. ->操作符
C. *解引用操作符
D. sizeof
题目名称:喝汽水问题
题目内容:
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
#include
int main()
{
int money = 0;
int total = 0;
int empty = 0;
scanf_s("%d", &money);
//买回来的汽水喝掉
total = money;
empty = money;
//换回来的汽水
while (empty >= 2)
{
total += empty / 2;
empty = empty / 2 + empty % 2;
}
printf("total = %d\n", total);
return 0;
}
//另一种方法
#include
int main()
{
int money = 0;
int total = 0;
int empty = 0;
scanf_s("%d", &money);
//买回来的汽水喝掉
if (money == 0)
{
total = 0;
}
else
{
total = 2 * money - 1;
}
printf("total = %d\n", total);
return 0;
}
GitHub代码