1.結構01
#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