结构体变量和普通的变量相同——在函数内部声明的结构体只能在该函数内部使用,所以通常结构体都是在函数外部声明,这样结构体就可以在多个函数中使用,一般都声明在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++下运行通过】
(如有错误,敬请指正)