码迷,mamicode.com
首页 > 其他好文 > 详细

1.结构01

时间:2018-01-09 12:13:47      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:post   简单的   字符   cell   一个   接下来   table   注意   for 循环   

#include <stdio.h>

struct student {

       int num;

       char name [10];

       int computer, english, math;

       double average;

};

以上是结构变量的定义。

结构变量的定义有三种方式,上面是第一种

第二种,混合定义:

Struct 结构名 {

       类型名 结构成员名1;

       类型名 结构成员名2;

       …

}结构变量名表;


struct student{

        Int num;

        Char name[10];

        Int computer, English, math;

        Double average;

} s1, s2; //注意,此处是main函数中定义一个结构变量的,相当于

struct student{

        Int num;

        Char name[10];

        Int computer, English, math;

        Double average;

};

Struct student s1, s2;//也就是说上面只是相当于将其放在main函数里面,可以参考函数的应用。

第三种与第二种类似,称为无类型名定义。

把student 去掉。其余和第二种一样。

相当于一次性结构。

struct {

        Int num;

        Char name[10];

        Int computer, English, math;

        Double average;

} s1, s2;

在此之后不能够再进行使用了。毕竟都没有student了,还怎么玩它?

 

int main()

{

       int i, n;

       struct student s1, max;

注意这一句话,这就是准备开始使用结构了。

       printf("Input n:");

       scanf("%d", &n);

       printf("Input the students‘ number, name and course scores\n");

       for(i = 1; i <= n; i++){

              printf("No.%d:\n",i);

              scanf("%d%s%d%d%d", &s1.num, s1.name, &s1.math, &s1.english, &s1.computer);

储存在这个结构之中。

              s1.average = (s1.math + s1.computer + s1.english)/3.0;

              if(i == 1) max = s1;

              if(max.average < s1.average) max = s1;

       }

但这是一个for循环语句,那些数据都已经被覆盖掉了。S1中的数据在不断的更新,就是说其他人的数据并没有被保存下来。只会留下最后一个s1的数据和最大的max的数据

 

       printf("num : %d, name:%s, average:%.2lf \n", max.num, max.name, max.average);

      

       return 0;

        

}

 

上面讲了定义,接下来就是初始化。

重新看一下其他变量的初始化。

int i = 1; 这里是对一个整型变量进行初始化,令其值为1;

当然也可以不进行初始化

int i ;

这样也一样可以使用。int i; i = 1; 这是一样的。

那么同理

char c = ‘a’; 与char c ; c = ‘a’;都是一样的;

还有数组

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int a[10];

a[0] = 1; a[1] = 2 ……

或者字符串

char c[10] = “I love you.”;

char c[10];

字符串后面的赋值较为复杂。

最简单的就是gets(s);

或者scanf("%s”, c);

亦或者用for 循环语句来一次一次(c[i] = getchar() ) != ‘\n’

值得注意的就是优先级的问题,!=的优先级要高于=。

 

那么同样的,结构也可以用于初始化。


struct student s1 = {101, “Zhang”, 78, 87, 85};

但是唯一的缺陷就是必须按照其顺序来。

定义结构变量的那一块内存的顺序是固定的。按照在结构中显示所作为。

int num;            char name[10];   int computer;     int English;          int math;     double average

↓                                ↓                          ↓                         ↓                    ↓                         ↓

101(4字节)

Zhang(10字节)

78(4字节)

87(4字节)

85(4字节)

(8字节)

 

 

其所占字节数也是可以确定的;

整个结构的字节数可以用sizeof (struct student)或者用sizeof (s1).来求得

但,我们是不是计算得到了34个字节,但它实际上却是40个字节;

我觉得很奇怪。

我观察到,

我单独定义一个

struct a{

       int b;

};

输出是4;

struct a{

       int b;

       int c;

};

两个,输出是8。

单独定义一个

{

       char b[10];

};

是10;但,不同的变量凑起来会怎么样?

{

       int a;

       char b[10];

}

并不是我们想象的结果,不是14,是16;

{

       int a;

       char b[10];

       char c[10];

}

单假如,我又放了一个c[10]进去,却又变成了24;

我有理由相信,在char b[10] 的后面,预留了两个字节的大小。

那么他存储的应该是这样

它需要凑到4的倍数。

(我用了多个char d[1])的方式发现了这个规律。

int num;            char name[10];   int computer;     int English;          int math;     double average

↓                                ↓                          ↓                         ↓                    ↓                         ↓

101(4字节)

Zhang(12字节)

78(4字节)

87(4字节)

85(4字节)

(8字节)

 

 

那么也还是不对啊,现在才36呢!剩下的四个怎么回事?

我盯向了double;

众所周知,double的类型是8个字节的。

我们先数一数前面的。4 + 12 + 4 + 4 + 4 = 28.

并不是8的倍数,所以我认为,是double跨了两个度。意思就是,double是由第33位开始存储的。29-32是前面int 的空位,继续补充int 也不会造成内存增大,同样前面在字符串后面补充两个字符也是OK的。

(PS:我很好奇这是不是一种结构内存优化的方法。。。尽量填满,坑就那么大。哦也)

 

以上,就是结构的定义与使用以及闲的蛋疼的一次储存探索。

 

1.结构01

标签:post   简单的   字符   cell   一个   接下来   table   注意   for 循环   

原文地址:https://www.cnblogs.com/qiluocao/p/8250720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!