#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:我很好奇这是不是一种结构内存优化的方法。。。尽量填满,坑就那么大。哦也)
以上,就是结构的定义与使用以及闲的蛋疼的一次储存探索。