C语言从零开始——struct初始

####   什么是结构体   ####

/*
        结构体:是一种数据结构,包含不同类型的数据。(可以包含基本数据类型,数组
,指针等)
        结构体和数组都是聚合数据类型,但数组中元素的类型相同,通过下标或者指针间
接访问元素。而结构体里面的数据被称为成员,由于每个成员类型大小可能不同,不能用下
标访问,可以通过名字访问
*/

演示代码:struct_1.c

#include <stdio.h>
typedef struct data
{
        int a;
        float b;
        char c;
}D;

int main(void)
{
        printf("sizeof(struct data) = %d \n",sizeof(D));//查看结构体size

        D s1; //定义一个结构体变量s1(实例化)
        s1.a = 11; //对变量内成员函数进行赋值
        s1.b = 2.33;
        s1.c = 'x';
        printf("s1.a = %d  s1.b = %.2f  s1.c = %c \n",s1.a,s1.b,s1.c);

        D s2;
        s2 = s1;//可以通过一个结构体变量给另一个结构体变量赋值(此处和数组不同,
数组不能这样通过数组名赋值;数组名不能做左值)
        printf("s2.a = %d s2.b = %.2f s2.c = %c \n",s2.a,s2.b,s2.c);

        return 0;
}

####   结构体数据存放原则   ####

/*
        结构体数据存放原则:
        字节对齐:各个成员变量进行字节对齐(用空间代价提升效率)
        1,编译器有一个默认的对齐字节数(32为是4,64位是8),然后确定成员变量中>最大元素类类型所占字节数;两者进行比较,选择较小值,从而确定真正的字节对齐数
        2,各个成员之间对齐;首元素直接放入结构体起始地址处,具体占几个字节,由>本身和下一个元素决定。接下来元素同理,具体占几个字节,由本身和下一个元素决定。最
后一个元素是否填充,看整个结构需要不需要填充。
        3,所有元素占用字节的实际数字之和就是结构体sizeof()的结果
*/
演示C代码:struct_2.c

#include <stdio.h>
#include <string.h>
struct data             
{
        char ch; //1+3
        int a; //4
        int b; //4
        char c[10]; //10+2
}d;

int main(void)
{
        printf("sizeof(d) = %d \n",sizeof(d));
        printf("d.ch = %d d.a = %d d.b = %d d.c = %s \n",d.ch,d.a,d.b,d.c);
        //d变量是全剧变量,未初始化;所以在.bss段,默认都为0;

        struct data d1; //此处d1为局部变量,存放在栈上
        d1.a = 3;
        d1.b = 5;
//      d1.c = "abc"; //error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’  数组名不能做左值
        strcpy(d1.c,"abc");
        printf("d1.a = %d d1.b = %d d1.c = %s \n",d1.a,d1.b,d1.c);
        return 0;
}


####   "."运算符   ####

/*
        "."运算符的实质:是指针,成员变量是通过地址偏移赵的相应自己的内存空间
*/

演示C代码;struct_3.c

#include <stdio.h>
struct data
{
        char ch;   //1、紧挨着放 2、各自对齐   1+3
        int a;
        int b;
        char c[10];
}d = {1, 3, 33, "1234"};

int main(void)
{


#if 0
        printf("&d = %p \n/*
        3个学生,按姓名或者成绩排名
*/

",&d);
        printf("&d.a = %p.\n", &d.a);

        int *p_a = (int *)((long)&d+0);
        printf("*p_a = %d \n",*p_a);
        
        int *p_b = (int *)((long)&d+4);  //结构体地址偏移四个字节;即a=3地址
        printf("*p_b = %d \n",*p_b);

#endif
        return 0;
}

####   小程序测试struct认知   ####

/*
        3个学生,按姓名或者成绩排名
*/

演示创建C代码;struct_4.c

#include <stdio.h>
typedef struct student  //定义结构体,包含三个成员:姓名,分数,学号
{
        char name[20];
        int score;
        int num;
}STU,*ST; //STU与typedef对应;ST为此结构体指针
void set_arr(ST p,int len) //传参含义(指向结构体的指针p , 学生人数)
{
        int i = 0;
        for (i = 0;i<len;i++)
        {
                printf("input the %d student imformation:(name + score + num) \n",i+1);
                scanf("%s%d%d",p[i].name,&p[i].score,&p[i].num); //输入每一个学生信息
         }
}
void show_arr(ST p,int len) //打印每一个学生信息;
{
        int i = 0;
        for(i=0;i<len;i++)
        {
                printf("name:%s \t score:%d \t num:%d \n",p[i].name,p[i].score,p[i].num);
        }
}
void swap_arr(ST p,int len) //以score为依据进行排名
{
        STU temp; //在交换过程中,是STU类型的数据在进行赋值,所以定义中间变量时,也应该是STU类型
        int i = 0 ,j = 0;
        for (j=0;j<len-1;j++)
        {
                for (i=0;i<len-j-1;i++)
                {
                        if(p[i].score > p[i+1].score)
                        {
                                temp = p[i];
                                p[i] = p[i+1];
                                p[i+1] = temp;
                        }
                }
        }
}
int main(void) //主函数里面测试用
{
        ST s;
        int len;
        len = 3;
        set_arr(s,len);
        show_arr(s,len);
        printf("---------------------------------\n");
        swap_arr(s,len);
        show_arr(s,len);
        return 0;
}
实现:

[root@localhost fsx_test_3]# ./a.out
input the 1 student imformation:(name + score + num)
fsx 44 123
input the 2 student imformation:(name + score + num)
lzz 55 124
input the 3 student imformation:(name + score + num)
qq 33 125
name:fsx      score:44      num:123
name:lzz      score:55      num:124
name:qq      score:33      num:125
---------------------------------
name:qq      score:33      num:125
name:fsx      score:44      num:123
name:lzz      score:55      num:124




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值