結構體變量和普通的變量相同——在函數內部聲明的結構體只能在該函數內部使用,所以通常結構體都是在函數外部聲明,這樣結構體就可以在多個函數中使用,一般都聲明在main函數上邊
結構體變量與函數
對於結構體變量,其賦值也可以使用強制類型轉換,如下面的例子
例1:
# include <stdio.h>
struct Student
{
int age;
float score;
char sex;
};
int main(void)
{
struct Student st;
st = (struct Student){21, 97.5, 'M'};
printf("%d %f %c\n", st.age, st.score, st.sex);
return 0;
}
這樣的賦值也是可以的,另外再強調一下結構體變量是可以相互賦值的,這點在《結構體_1》中說過了
結構體可以通過結構體變量以參數形式傳遞到函數中,也可以作爲函數的返回值,當然,與普通變量相同,傳進函數的知識結構體變量的值,而不是結構體變量,如果想利用函數對結構體變量進行某種操作,可以使用指針,也可以返回一個結構體變量的值
要知道,不能用scanf直接輸入一個結構的內容,但可以通過函數給結構體賦值,這就需要讓函數的返回值爲結構變量,因爲C語言的函數是傳值的,只傳值是不會改變函數外部變量的值的
例2:
# include <stdio.h>
struct Student {
int x;
int y;
};
struct Student print() {
struct Student t;
scanf("%d", &t.x);
scanf("%d", &t.y);
return t;
}
int main(void) {
struct Student st1;
st1 = print();
printf("st1.x = %d, st1.y = %d\n", st1.x, st1.y);
return 0;
}
示例輸出結果爲:
這個程序是結構體作爲函數返回值,第8到14行是定義了一個返回類型爲struct Student 的函數
結構體數組
既然可以定義結構體變量,自然也可以定義結構體數組,還可以定義結構體中的結構體
例3:
# include <stdio.h>
struct Time {
int year;
int month;
int day;
};
//輸出結構體的值
void output(struct Time t) {
printf("year = %d\n", t.year);
printf("month = %d\n", t.month);
printf("day = %d\n", t.day);
printf("\n");
}
int main(void) {
int i, t;
struct Time tarr[3] = {{1949, 10, 1}, {1963, 8, 1}, {2008, 8, 8}};
t = sizeof(tarr) /sizeof(tarr[0]);
for (i=0; i<t; i++) {
output(tarr[i]);
}
return 0;
}
輸出結果爲:
在這個程序,結構體變量在函數output()中做了參數
另外,第20行代碼表示得到該結構體數組的元素個數
再舉一個輸入結構體數組成員的例子
例4:
# include <stdio.h>
const int I = 3;
struct Time {
int year;
int month;
int day;
};
//輸出結構體的值
void output(struct Time t) {
printf("year = %d\n", t.year);
printf("month = %d\n", t.month);
printf("day = %d\n", t.day);
printf("\n");
}
int main(void) {
int i;
struct Time tarr[I];
printf("請輸入這%d個結構體變量的值:\n", I);
for (i=0; i<I; i++) {
scanf("%d", &tarr[i].year);
scanf("%d", &tarr[i].month);
scanf("%d", &tarr[i].day);
}
printf("輸出結果爲:\n");
for (i=0; i<I; i++) {
output(tarr[i]);
}
return 0;
}
示例輸出結果爲:
嵌套的結構
其實,有時候爲了方便,也會在結構體中定義結構體變量,如下例
例5:
# include <stdio.h>
struct time {
int hour;
int minute;
int second;
};
struct Time {
int year;
int month;
int day;
struct time st;
};
//輸出結構體的值
void output(struct Time t) {
printf("year = %d\n", t.year);
printf("month = %d\n", t.month);
printf("day = %d\n", t.day);
printf("hour = %d\n", t.st.hour);
printf("minute = %d\n", t.st.minute);
printf("second = %d\n", t.st.second);
printf("\n");
}
int main(void) {
int i, t;
struct Time tarr[] = {{1949, 10, 1, {5, 40, 00}}, {1963, 8, 1, {12, 0, 0}}, {2008, 8, 8, {16, 38, 45}}};
t = sizeof(tarr) /sizeof(tarr[0]);
for (i=0; i<t; i++) {
output(tarr[i]);
}
return 0;
}
輸出結果爲:
注意第21到23行代碼,輸出一個結構體中的其他結構體變量的值
【所有代碼均在windows系統下dev c++下運行通過】
(如有錯誤,敬請指正)