C TRICKS2

发布于 2022-11-06  445 次阅读


结构体

结构体的嵌套

  • 在本次任务中,遇到了结构体中实例化联合体的情况,于是就产生了下面这个问题
#include<bits/stdc++.h>

enum sex                    //性别枚举类型
{
    boy=0,                      
    girl=1                   
};                           

union birthday{             //生日联合类型
struct time{

int year:16;
int month:8;
int day:8;
};
time time1;
int compare;
};

struct students{    //主结构体
    int id;
    char name[100];
    int score1;
    int score2;
    int score3;
    int score4;
    birthday birthday1;
    sex sex1;

};

struct chuan{
    char ming[100];
}chuan1;

students student[100];
int sum,in;
char ming[100];
  • 在student[1]中实例化了birthday的birthday1,在student[2]中也实例化了birthday的birthday1,两个birthday1联合体名称一样,但它们的地址不同,值也不会相互覆盖
  • 如果在结构体里面声明了结构体或者联合体,那么调用时依次加点就可以了

联合体

  • 本次任务中我刚开始没有理解到这个东东,查了许多资料,也问了师傅很久,才弄明白这个的使用
  • 联合体本质上是一个变量,联合体变量的大小取决于其中最大的变量类型大小,比如:
union birthday{             //生日联合类型
struct time{

int year;
int month;
int day;
};
int compare;
};
  • 这个联合体里面有一个struct和一个int,struct的大小要占用12个字节一共是96位,int占4个字节,所以联合体占用96位
  • 联合体中的变量共用联合体变量的位域,可以通过int year:8;来表示使用96位中的前8位,如果想要不让他们的位域重叠,就需要将联合体中声明struct
  • 换句话说,struct就是自动将位域分配给不同变量使他们独自使用自己的位域的联合体
  • 最后,输入联合体数据是要借用第三者变量来输入,因为联合体变量不能取地址符,如
int year,month,day;
        printf("请输入第%d个学生的数据\n",a);//循环输入学生数据
        scanf("%d %s %d %d %d %d %d %d %d %d",&student[a].id,&student[a].name,&student[a].score1,&student[a].score2,&student[a].score3,&student[a].score4,&year,&month,&day,&student[a].sex1);
        printf("\n");
        student[a].birthday1.time1.year=year;
        student[a].birthday1.time1.month=month;
        student[a].birthday1.time1.day=day;
  • 如果直接这样就会报错
scanf("%d %s %d %d %d %d %d %d %d %d",&student[a].id,&student[a].name,&student[a].score1,&student[a].score2,&student[a].score3,&student[a].score4,&student[a].birthday1.time1.year,&student[a].birthday1.time1.month,&student[a].birthday1.time1.day,&student[a].sex1);

数组的比较

  • 不止是在结构体中定义的数组,只要是两个数组比较值,比如
if(student[1].name==chuan1.ming)
  • 这个if是绝对进不去的,因为数组在被比较时会退化为指针,而比较这两个指针时比较的是这两个指针的地址,他们俩是不同变量,指针肯定是不同的,所以if肯定是进不去的
  • 想要比较字符串数组(或者其他数组)的值是否一样,可以使用strcmp()函数
声明

下面是 strcmp() 函数的声明。

int strcmp(const char *str1, const char *str2)

参数

    str1 -- 要进行比较的第一个字符串。
    str2 -- 要进行比较的第二个字符串。

返回值

该函数返回值如下:

    如果返回值小于 0,则表示 str1 小于 str2。
    如果返回值大于 0,则表示 str1 大于 str2。
    如果返回值等于 0,则表示 str1 等于 str2。

指针

  • 指针上次报告写的差不多涵盖这次的内容了,这里就回答一下任务中的问题吧
1.  什么是指针? 
2.  什么是指针变量?指针变量与指针是什么关系? 
3.  如何定义指针变量,以及如何使用指针变量?
包括指针变量的初始化,内存的间接访问。 
4.  什么是指针的类型,以及指针类型起到什么作用?
  • 指针是内存地址
  • 指针变量是存储内存地址的变量
  • 指针变量与普通变量的定义方法一样,一种类型的普通变量的地址必须由同种类型的指针变量来存储比如:
float x=0,y=0;
    printf("x=%f y=%f\n",x,y);

    float *p;
  • 如果用int*来定义p就会出错
  • 指针变量有可以有不同定义,但指针变量只有一种类型,即4个字节大小的存储地址的类型
#include<bits/stdc++.h>
int main()
{
    float x=0,y=0;
    printf("x=%f y=%f\n",x,y);

    float *p;
    p=&x;
    *p=10;
    printf("x=%f y=%f\n",x,y);

    p=&y;
    *p=20;
    printf("x=%f y=%f\n",x,y);

    x=100;y=100;
    printf("%f",*p);
    return 0;
}
  • p是一个指针变量,存储的是地址,*p是p所存储的地址的值,也就是x的值,通过对*p的值进行修改可以间接修改x的值
届ける言葉を今は育ててる
最后更新于 2024-02-07