结构体类型总结

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

/*
* 小技巧:利用Tab键自动补齐
* 编译链接
* 周六讲作业
* 结构体:自定义数据类型
* struct 结构体名
* {
*     成员列表
*  };
*  结构体使用:
*     struct 类型名  变量名 = {};
*     结构体普通变量通过"."访问其成员.例如 stu.age = 20;
*     结构体指针变量通过"->"访问其成员,例如 p->age = 20;
*    C语言两个符号自带解引用 ,[]和->. 
           arr[i]==*(arr+i); p->age==(*p).age
*    在结构体中,参数传递总是传指针,不传结构体本身,为了节约空间
*   C语言不支持函数名重载即不允许同名的函数多次出现.
*   C++支持函数名重载,即一个函数名可以多次出现.
*   C: 生成的符号只是在函数名前加"_".例如 _Max26
*   C++: 生成的符号由函数名+参数列表+返回值,即参数不同生成的符号也不同
*/

//姓名(char 数组),年龄(int),分数(int)
struct Student
{
    char name[20];//姓名
    int age;//年龄
    int score;//分数
};//这个结构体类型定义完成,它的作用和int完全相同

//void Max26(char a, char b)
//{}
//char Max26(char a, char b)
//{
//    return '\0';
//}

struct A
{
    char a;
    int b;
};

int main()
{
    printf("%d\n",sizeof(struct A));//8  ??  内存对齐

    //Max26(10,20);//调用时不唯一

    printf("%d\n",printf("0123"));//阿里巴巴笔试

    int a=0, b=0;
    int len = scanf("%d,%d",&a,&b);
    printf("%d\n",len);
    printf("%d,%d\n",a,b);

    return 0;
}

/*
//输出学生信息
void Print(struct Student a)//这种设计非常不好
{
    printf("%s,%d,%d\n",a.name,a.age,a.score);
}//Print->_Print(C语言);Print->Print+参数(C++)

void Print(const struct Student* p)
{
    printf("%s,%d,%d\n",p->name,p->age,p->score);
}//Print->_Print(语言);Print->Print+参数(C++)

int main()
{
    struct Student stu = { "曹操",20,80 };
    struct Student stu2 = {"刘备",18,70};
    struct Student* p = &stu;
    //Print(stu);
    //Print(stu2);
    Print(&stu);
    Print(&stu2);

    return 0;
}
*/

//struct A
//{
//    int a;
//    struct Student b;
//    //struct B c;//error
//};
//
//struct B
//{
//    int a;
//};
//
//struct C
//{
//    int a;
//    int b;
//};

//void Fun();

//int main()
//{
//    char name[20];
//    //name = "孙权";
//    strcpy(name,"孙权");
//    return 0;
//}

//int main()
//{
//    struct Student stu = {"曹操",20,80};
//    struct Student stu2 = {"刘备",18,70};
//    struct Student* p = &stu;
//    p = &stu2;
//    (* p).age = 20;
//    p->age = 21;
//    //通过p输出学生信息
//
//
//    return 0;
//}

//void Fun(int a)
//{
//    ++a;//改变的仅仅是形参
//}
//
//void Init(int* p, int len)
//{
//    for (int i = 0; i < len; i++)
//        p[i] = 0;//*(p+i) = 0;
//}
//
//void Show26(int* arr, int len)
//{
//    for (int i = 0; i < len; i++)
//        printf("%d ",arr[i]);
//    printf("\n");
//}
//
//int main()
//{
//    int a = 10;
//    Fun(a);
//    printf("%d\n",a);//10
//
//    int arr[] = {1,2,3,4,5,6,7,8,9,10};
//    Init(arr,sizeof(arr)/sizeof(arr[0]));
//    Show26(arr, sizeof(arr) / sizeof(arr[0]));
//
//    return 0;
//}

//int main()
//{
//    int a = 10;
//    int b;//随机值
//    int* p = &a;
//    int arr[10] = {1,2,3,4,5,6};//初始化一部分则剩余部分为0
//
//    struct Student     stu = {"曹操",20,80};
//    struct Student stu2;//随机值
//    struct Student stu3 = {"刘备"};//初始化一部分则剩余部分为0
//    stu3.score = 60;
//    stu3.age = 18;
//    //练习,输出stu3的所有数据
//    printf("%s,%d,%d\n",stu3.name,stu3.age,stu3.score);
//    //把stu3的姓名改为"孙权"
//    //stu3.name = "孙权";//error
//    strcpy(stu3.name,"孙权");
//    printf("%s,%d,%d\n", stu3.name, stu3.age, stu3.score);
//    //struct C sa = {1};
//    //printf("%d\n",sa.a/sa.b);//崩溃,除0
//
//    Fun();
//
//    //printf();
//    return 0;
//

#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <time.h>

/*
* typedef:类型定义,定义新的类型  (给类型起别名)
*  typedef 旧类型  新类型;
*   typedef应用场景:
*     1.把长的类型起一个简短的别名
*     2.起一个和问题相关的别名.例如time_t
*结构体:

*/
struct A
{

};

int main()
{
    return 0;
}
/*
//typedef 西安财经大学 西财;
typedef unsigned long long int  uint64;//64位
typedef int* Pint;
typedef int Arr[10];
int brr[10];

struct Student
{
    char name[20];
    int age;
};

typedef struct Student Student;//后面就可以直接使用Student

typedef struct A
{
    char a;
    int b;
}A,*PA; //A == struct A;  PA == struct A *
//typedef struct A A;
//typedef struct A* PA;//PA == struct A *

int main()
{
    struct Student stu = {"liubei",20};
    Student stu2 = {"caocao",21};

    unsigned long long int a = 10;
    uint64 b = a;
    uint64* p = &a;
    int c = 10;
    int* p1 = &c;
    Pint p2 = &c;//Pint 就是int *的别名
    Arr d;//d就是长度为10的int数组
    printf("%d,%d\n",sizeof(Arr),sizeof(d));
    //malloc();
    size_t;
     time_t t1 = time(NULL);//int  
    printf("%lld\n",t1);

    return 0;
}
*/

//struct Student
//{
//    int id;//学号
//    char name[20];//姓名
//    int score;//成绩
//};
//
//void Input(struct Student* arr, int len)
//{
//    printf("请输入%d个学生信息\n",len);
//    for (int i = 0; i < len; i++)
//        scanf("%d %s %d",&arr[i].id,&arr[i].name,&arr[i].score);
//}
//void Show(struct Student* arr, int len)
//{
//    for (int i = 0; i < len; i++)
//    {
//        printf("%d,%s,%d\n",arr[i].id,arr[i].name,arr[i].score);
//    }
//}
//
//int Cmp_stu_sco(const void* vp1, const void* vp2)
//{
//    return -(((struct Student*)vp1)->score - ((struct Student*)vp2)->score);
//}
//
//int main()
//{
//    struct Student arr[5];
//    Input(arr,sizeof(arr)/sizeof(arr[0]));
//    int len = sizeof(arr) / sizeof(arr[0]);
//    qsort(arr,len,sizeof(struct Student),Cmp_stu_sco);
//    Show(arr, sizeof(arr) / sizeof(arr[0]));
//
//    return 0;
//}

//struct Person
//{
//    char name[20];//候选人名
//    int count;//票数
//};
//
len:候选人数量
//void Ticket(struct Person* arr, int len)
//{
//    char name[20];//从键盘读取选票
//    for (int i = 0; i < 5; i++)//唱票,模拟5个选民
//    {
//        scanf("%s",&name);
//        //和所有的候选人比较
//        for (int j = 0; j < len; j++)
//        {
//            if (strcmp(arr[j].name, name) == 0)
//            {
//                arr[j].count++;
//                break;
//            }
//        }
//    }
//}
//
//void Show(struct Person *arr,int len)
//{
//    for (int i = 0; i < len; i++)
//    {
//        printf("%s,%d\n",arr[i].name,arr[i].count);
//    }
//}
//
//int main()
//{
//    struct Person arr[3] = {"caocao",0,"liubei",0,"sunquan",0};
//    Ticket(arr,sizeof(arr)/sizeof(arr[0]));
//    Show(arr, sizeof(arr) / sizeof(arr[0]));
//
//    return 0;
//}

//struct Student
//{
//    char name[20];
//    int age;
//};
//
//void Show(const struct Student* arr, int len)
//{
//    for (int i = 0; i < len; i++)
//    {
//        printf("姓名:%s,年龄:%d\n", arr[i].name, arr[i].age);
//    }
//}
//
//int main()
//{
//    struct Student arr[3] = { {"曹操",20},{"刘备",21},{"孙权",18}};
//    /*for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
//    {
//        printf("姓名:%s,年龄:%d\n",arr[i].name,arr[i].age);
//    }*/
//    Show(arr, sizeof(arr) / sizeof(arr[0]));
//
//    return 0;
//}
//
//struct Day
//{
//    int year;
//    int month;
//    int day;
//};
//
//struct Student
//{
//    int id;//学号
//    char name[20];//姓名
//    int sco[3];//三科成绩
//};
//
//int GetDays(struct Day* pd)
//{
//    int count = 0;
//    int arr[] = {31,28,31,30,31,30,31,31,30,31,30,31};
//    if (pd->year % 4 == 0 && pd->year % 100 != 0 || pd->year % 400 == 0)
//        arr[1] = 29;
//
//    for (int i = 0; i < pd->month-1; i++)//1,1
//        count += arr[i];
//
//    count += pd->day;
//
//    return count;
//}
//
//void Input(struct Student* p, int len)
//{
//    printf("请输入%d个学生信息\n",len);
//    printf("学号  姓名  科目1分数 科目2分数 科目3分数\n");
//    for (int i = 0; i < len; i++)
//    {
//        scanf("%d %s %d %d %d",&(p->id),&p->name,
//            &p->sco[0],&p->sco[1],&p->sco[2]);
//        p++;
//    }
//}
//
//void Show(struct Student* p, int len)
//{
//    for (int i = 0; i < len; i++)
//    {//p[i] == *(p+i)
//        printf("%d,%s,%d,%d,%d\n",p[i].id,p[i].name,
//            p[i].sco[0],p[i].sco[1],p[i].sco[2]);
//    }
//}
//
//int main()
//{
//    int arr[10] = {1,2,3};
//    struct Student brr[2];
//    Input(brr,sizeof(brr)/sizeof(brr[0]));
//    Show(brr, sizeof(brr) / sizeof(brr[0]));
//
//    return 0;
//}

//int main()
//{
//    struct Day d1 = {2022,1,1};
//    struct Day today = {2022,11,17};
//    printf("%d\n",GetDays(&d1));
//    printf("%d\n", GetDays(&today));
//
//    return 0;
//}

n#define _CRT_SECURE_NO_WARNINGS//必须放在第一行
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>

/*
* struct :
*   定义:
*   使用:
* typedef:类型定义
* 共用体:也称联合体,公用同一段内存
*   union 类型
* 内存对齐:

* char(1) ,short(2) ,int (4),long(4) ,long long(8) ,float(4),double(8),指针(4,8)
*/

//#pragma pack(1)//以1对齐

struct A
{
    char a;//1+3
    char buf[3];//不使用
    int b;//4
};//8

struct B
{
    char a;//1+1
    short b;//2
    int c;//4
};//8

struct C
{
    char a;//1+7
    double b;//8
    short c;//2+6
    long long d;//8
};//32

struct D
{
    short a;//2+2
    int* b;//4
    double c;//8
};

struct E
{
    char a;//1+1
    short b[400];//800,(2)  +2
    int c;//4
};

struct F
{
    char a;//1+3
    struct FF 
    {
        int b;
        float c;
    }d;//8
};//12

struct G
{
    char a;//1+3
    int b;//4
    short c;//2
};//10+2

struct H
{
    int a;//4
    char b;//1
};//5+3

struct I  //特殊情况,请记忆
{
    char a;//1
    struct II
    {
        int b;
        float c;
    };//0  II只是类型没有定义变量
    int d;//4
    //float;
};

struct J //特殊情况
{
    char a;//1+3
    struct   //无名变量(没有类型名也没有变量名,生成一个无名的变量)
    {
        int b;
        float c;
    };//8
    int d;//4
};//16

struct K
{
    char a;//1
    union kk
    {
        int b;
        float c;
        char d;
    }e;//4
    int f;//4
};//12

struct L
{
    char a;//1+3
    union
    {
        int *front;
        int* up;
        int* next;
    };//4
};//8

//判断大小端
bool IsLittle()
{
    return true;//??
}

int main()
{
    printf("%d\n",sizeof(struct A));
    //struct G sa;//10
    //struct G arr[2];
    struct L sl;
    //sl.

    return 0;
}

/*
struct  A
{
    char a;
    short b;
    int c;
};//8

union B//共用体,
{
    char a;
    short b;
    int c;
};//4,不能同时使用多个成员

union C
{
    int a;
    int b;
    float c;
};


int main()
{
    printf("%d\n",sizeof(struct A));

    union C ua;
    ua.a = 10;
    ua.c = 12.5f;//使用错误
    printf("%d\n",ua.a);

    union B ub; //经典笔试题
    ub.a = 'a';
    ub.b = 200;
    ub.c = 0x12345664;
    printf("%c\n",ub.a);//'d'

    short s = 0x1234;

    return 0;
}*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值