三丶结构体
构造体相当于用户自己定义一种数据结构里面可以存放各种不同的数据类型
structDate
{
intday;
intmouth;
intyear;
};
struct Student
{
intnum;
charname[20];
charsex;
intage;
struct Date birthday;
charaddr[30];
}student1,student2; ---注意变量名的定义
代码中的 Date相当于结构体的类型名 而birthday则为结构体的变量名
注意:
[if !supportLists]1. [endif]结构体的类型名和结构体的变量名是不同的概念,只能对变量赋值,存取或运算,而不能对一个类型赋值、存取或运算。并且在编译时对类型是不会分配空间的
[if !supportLists]2. [endif]结构体中成员的变量名可以与程序中的变量名相同,不过两个指的是不同的对象,并且互不干扰
[if !supportLists]3. [endif]结构体中的成员也能够单独使用
struct Student
{
intnum;
charname[20];
charsex[10];
intage;
charaddr[30];
}student3= {97001,"吴宣仪","女",23,"海南"};
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n地址:%s", student3.num,student3.name, student3.sex, student3.age, student3.addr);
注意其使用
顺便提一下C语言中 scanf中如果要求输入数组的话 可以不用加取址符!因为数组本身就有地址
同时还有结构体数组的使用
结构体指针 (主要代码如下)
struct Student
{
intnum;
charname[20];
charsex[10];
intage;
charaddr[30];
}student3 ={97001,"吴宣仪","女",23,"海南"};
struct Student*p,*p2,*p3;
struct Student student[3] = { { 97001, "吴宣仪", "女", 23, "海南" }, { 97001, "赵丽颖", "女", 27, "河北" }, { 97001, "张艺兴", "男", 25, "长沙"} };
p =&student3;
p2 =&student[2];
p3 =&student[1];
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n地址:%s\n\n", student3.num,student3.name, student3.sex, student3.age, student3.addr);
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n地址:%s\n\n", (*p).num, (*p).name,(*p).sex, (*p).age, (*p).addr);
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n地址:%s\n\n", (*p2).num,(*p2).name, (*p2).sex, (*p2).age, (*p2).addr);
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n地址:%s\n\n", p3->num,p3->name, p3->sex, p3->age, p3->addr);
1.注意点 当用指针指向结构体成员的时候 如(*p2).num 括号不可省略 因为.的优先级比*高
否则就会变成*(p2.num)会出错的
2. structStudent*p1;
p1 = (structStudent*)&student[0].num; 注意指向如果想去指向结构体中的成员地址的话,则 必须要使用强制转换
指向结构体数组的指针
struct Student
{
intnum;
charname[20];
charsex[10];
intage;
charaddr[30];
};
struct Student*p;
struct Student student[3] = { { 97001, "吴宣仪", "女", 23, "海南" }, { 97001, "赵丽颖", "女", 27, "河北" }, { 97001, "张艺兴", "男", 25, "长沙"} };
for(p =student; p < student + 3; p++)
{
printf("学号:%d\n姓名:%s\n性别:%s\n年龄:%d\n地址:%s\n\n", p->num,p->name, p->sex, p->age, p->addr);
}
仔细观察这个for循环中的p的作用 指向地址并且一直在自加一 十分巧妙的方法
3.用结构体变量或者结构体变量成员去作为函数参数时 为值传递(其运行的函数不会改变其原来的值,只会产生一种新的影响)
结构体指针变量 则为址传递