1. 程式人生 > >1.結構01

1.結構01

for 循環 重新 我們 english com course etc 3.0 input

#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