C语言学习:结构体

一、结构体声明、初始化:
方法一:
struct student{
  int num;
  char name[20];
  char sex;
       int age;
       float score;
       char addr[20];
} ;                                      //不要忘记写分号

int num;                             //在这里定义的num跟结构体中的num没关系,可以正常使用。
struct student s1,s2;          //定义结构体变量
scanf("%d%s%d%c%f%s",&s1.num,s1.name,&s1.age,&s1.sex,&s1.score,s1.addr);  //注意:1.输入的时候要把相同类型的分开。如
                                                                                                        name和 sex,中间放了个age,如果不放的话,没法区分。这是因为
                                                                                                        在name后面要先输入空格,然后再输入M或F。但是%c会直接
                                                                                                         空格当做字符,这样就读不了M了。scanf()会继续往下走,直
                                                                                                        到数字的时候就读数字去了。
                                                                                                        2.注意哪些变量需要加“&”,哪些不用。
                                                                                                        3.要一个变量一个变量地写,不能直接写:s1.
                                                                                                         4.在键盘上输的时候,应该打:1001 "liming"  20M 90.0 "china" ,要
                                                                                                        注意在20和 'M'中间不要加空格。
printf("%d  %s   %c ",s1.num,s1.name,s1.sex);         //打印的时候也是要一个一个打印。
s2=s1;                                                  //这种写法是错误的。虽然在VS下面可能能通过。
memcpy(&s2,&s1,sizeof(s1));              //如果想直接赋值,可以用memcpy拷贝。

方法二:
struct student{
  int num;
  char name[20];
       float score;
}s1,s2;

二、结构体对齐:
struct student{
  int num;
  char name[20];
  char sex;
       int age;
       float score;
       char addr[20];
};
如以上结构体:如果用手工计算大小为:4+20+1+4+4+20=53。但是实际上sizeof(struct student)等于56.这就是因为存在对齐的问题。
所以在工作当中想要知道结构体占多少空间,不要自己算。比如malloc的时候,要用sizeof()函数来求一个结构体的大小。
malloc(sizeof(struct student)*10);
网上有很多关于内存对齐的资料,研究太深没有必要,工作中记住两条即可:
1.把小的放在一起。
2.把小的放在最后。

三、结构体嵌套:
struct bir{
  int year;
  int mon;
  int day;
}
struct student{
  int num;
  char name[20];
  char sex;
       int age;
       float score;
       char addr[20];
  struct bir birthday;
}s1;

s1.birthday.day=3;

四、结构体数组
struct student{
  int num;
  char name[20];
  char sex;
       int age;
       float score;
       char addr[20];
};

struct student a[5];                            //结构体数组
struct student s[2]={{ 1001,"liming",20,'M',90.0,"Shenzhen" },{ 1002,"xiaohua",21,'F',80.0,"Shanghai" }};  //结构体数组赋初值
int i=0;
while(scanf("%d%s%d%c%f%s",&s[i].num,s[i].name,&s[i].age,&s[i].sex,&s[i].score,s[i].addr)!=EOF){    //经过键盘输入多个
  i++;
}

struct student *p;
p=a;
p++;                                    //此时p指向了a[1]

五、结构体指针:
struct student{
  int num;
  char name[20];
  char sex;
       int age;
       float score;
       char addr[20];
}s1;
struct student *p;     //结构体指针
p=&s1;
printf("%d", p->num);     / /访问方式一
printf("%d", (*p).num);   / /访问方式二:先解引用,解引用就是结构体。结构体指针指向结构体,解引用是结构体。

a=p->num++;                 //首先:a=(p->num)  ,然后:(p->num)++
a=++p->num;                 //首先:(p->num)++  ,  然后:a=(p->num)

六、结构体指针作为函数参数:
void func(struct student *s1){         //一般不会在形参的位置传递大数据。所以很少在这里传递整个结构体,一方面不能改变外面                                                                的,另一方面数据量太大。一般是传递结构体指针。
}


猜你喜欢

转载自blog.csdn.net/pengchengliu/article/details/80472758