第十三课 结构体

结构体

定义

数据类型:基本类型 / 自定义类型

基本类型就是系统提供,用户可以直接使用:float double char int

自定义类型就是系统没有用户可以根据自己需要来创建的数据类型,这种类型的特点:一个变量不单能够包含若干数据,同时还能是不同的类型;

int x;

int a[]; 这两种数据都是单一类型,仅仅存储 int 变量;

结构体数据类型,即多又不同;

在 c program 中,自定义类型主要提供两种:结构体数据,共用体类型(共同体)

结构体数据类型的创建:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
struct 结构体类型名                    // 定义结构体类型,一般定义在全局
{
    int a;                           //成员类型 成员名;
    float b;                         //  成员类型 成员名;
    char c;
    char d[100];
};

struct 结构体类型名 结构体变量名;        // 定义结构体变量


struct intfloat a = {23,1.02,'a',"aaaa"};    // 结构体变量初始化

printf("%d",a.a);        // 结果为23, 结构体名.成员名  引用方法
printf("%s",a.d);        // 结果为 aaaa
a.c = 'k';               // 单个成员赋值 

a.d = "bbbb"           // 字符串在初始化过后不可以直接复制;
strcpy(x.d,"abcdefg");   // 这样能够变相赋值

在结构体中想包含哪些数据,就定义对应变量;

结构体指针

如果用结构体指针来引用成员,格式为:

1
2
3
4
5
struct intfloat *p;
struct intfloat a;
p = &a;

printf("%s",p->d);             // 结构为 aaaa,无须带星号

Q1 从键盘输入 10 个同学的考试信息,考试信息包含

学号:long

性别:char m/w

成绩:int

输出最高分同学的所有信息;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct student{
    long number;
    char x;
    int score;
};

main(){

    struct student data[10],*p;
    int k,i,max;
    p = &data;
    for(i=0; i<10; i++){
        scanf("%ld %c %d",&p[i].number,&p[i].x,&p[i].score);
    }
    max=data[0].score;
    for(i=1; i<10; i++){
        if(p[i]->score > max)
            max = p[i]->score;
            k = i;
    }
    printf("%ld %c %d\n",p[k]->number,p[k]->x,p[k]->score);
}

结构体的类型长度

1
2
3
sizeof(struct std);        // 结构体类型长度等于各个成员类型长度之和

// 如上题,4+1+4 = 9,即 9 字节; 实际输出12个字节,求出最大字节数乘以成员数,即 4*3 =12

共同体

共用体关键字:union

共用体所有的成员共用一个空间,这个空间就是成员当中最大的那个!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
union std {
    long xh;
    double x;
    int j;
};

main(){
    union std data;
    data.xh = 12;
    data.j = 1.333;
    printf("%ld",data.xh);
}
// 结果为 1.333

// 因为在共用体里,所有成员都是用同一个空间,所有元素的结果 等于最后一次赋值的结果;

存储类型

在 c program 中存储类型有三种:

auto 动态存储类型
static 静态存储类型
register 寄存器类型

auto 存储类型是最常用的,最有效;随用随给,不用回收;

static 静态类型,一旦将存储空间分配给某个变量,在程序没有结束前,这个空间是不能收回的,永远保存存储的数据,在函数内不会消亡。

register 寄存器类型:寄存器是 cpu 中的一块,如果变量是 register 类型,那么该变量的数据是直接送给 cpu 处理,而不需要内存中转;

**Q2 **

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
int x;
int fun(int x){
    int a=1,b=1;
    static c = 1;
    a++;
    b++;
    c++
    return a+b+c+x;
}

main(){
    int i;
    for(i=1; i<=3; i++)
        printf("%d",fun(i));
}

// 第一轮循环
// i=1,a=b=c=2  ,re = 6+1 = 7
// 第二轮循环
// i=2,a=b=2,c=3 re = 7+2 = 9
// 第三轮
// i=3,a=b=2,c=4,re=8+3 = 11
Licensed under CC BY-NC-SA 4.0
本文阅读量 次, 总访问量 ,总访客数
Built with Hugo .   Theme Stack designed by Jimmy