1,结构作为函数参数
例子(以int函数为主): int 函数名 (struct date d)
- 整个结构可以作为参数的值传入函数
- 新建一个结构变量,并复制调用者的结构的值
2,输入\出结构
(1)输入结构 方法一
在这个传入函数中,创建一个临时的结构变量,然后把这个结构返回调用者
#include <stdio.h>
struct number{
int x;
int y;
int z;
};
struct number getStructure(void);
int main(){
struct number a;
a=getStructure();
printf("x = %d\n",a.x);
printf("y = %d\n",a.y);
printf("z = %d\n",a.z);
return 0;
}
struct number getStructure(void){
struct number p;
scanf("%d",&p.x); 12
scanf("%d",&p.y); 13
scanf("%d",&p.z); 14
return p;
}
输出:
x = 12
y = 13
z = 14
(2)输入结构 结构指针作为参数 //返回结构指针
(*p).month=12;
p->month=12;
用->表示指针所指的结构变量中的成员
#include <stdio.h>
struct number{
int x;
int y;
int z;
};
struct number* getStructure(struct number* p);
int main(){
struct number a;
getStructure(&a);
printf("x = %d\n",a.x);
printf("y = %d\n",a.y);
printf("z = %d\n",a.z);
return 0;
}
struct number* getStructure(struct number* p){
scanf("%d",&p->x); 12
scanf("%d",&p->y); 13
scanf("%d",&p->z); 14
return p;
}
输出:
x = 12
y = 13
z = 14
3,结构数组
struct 结构名 数组名[数组大小];
#include <stdio.h>
struct number{
int x;
int y;
int z;
};
struct number* getStructure(struct number* p);
int main(){
int i;
struct number a[]={ //初始化数组
{2021,7,21}, //初始化结构a[0]
{2021,8,29},
};
for(i=0;i<2;i++){
printf("x = %d ",a[i].x);
printf("y = %d ",a[i].y);
printf("z = %d\n",a[i].z);
}
return 0;
}
输出:
x = 2021 y = 7 z = 21
x = 2021 y = 8 z = 29
4,嵌套结构
必须先定义成员结构的类型,再定义主结构的类型
#include <stdio.h>
struct number{
int x;
int y;
};
struct num{
struct number r1;
};
struct number* getStructure(struct number* p);
int main(){
int i;
struct num* b;
struct num a={{11,22}};
printf("a.r1.x = %d ",a.r1.x); //第一种取值方式
printf("a.r2.y = %d\n ",a.r1.y);
printf("b->r1.x = %d ",&b->r1.x); //第二种取值方式
printf("b->r1.y = %d\n",&b->r1.y);
return 0;
}
b->r1->y (X)
5,结构中的结构的数组
struct num{
struct number r1;
struct number r2;
};
int main(){
int i;
struct num* b;
struct num a[]={
{{11,22},{33,44}}, //初始化主结构a[0]
};
printf("a[0].r1.x = %d ",a[0].r1.x);
printf("a[0].r1.y = %d\n ",a[0].r1.y);
printf("\n");
printf("a[1].r2.x = %d ",a[0].r2.x);
printf("a[1].r2.y = %d\n ",a[0].r2.y);
return 0;
}
输出:
a[0].r1.x = 11 a[0].r1.y = 22
a[0].r2.x = 33 a[0].r2.y = 44
-
不同的成员变量组合,结构的sizeof如何,是否正好等于全部成员的sizeof之和?
-
结构内的成员之间是否连续,相邻的成员的地址的差是否等于对应的成员的sizeof?
#include<stdio.h>
struct date{
int month;
double day;
char year;
}today;
int main(void)
{
struct date today;
today.month = 0;
today.day = 5;
today.year = '1';
printf("sizeof(today) = %d\n",sizeof(today));
printf("sizeof(today.month+today.day+today.year) = %d\n"
,sizeof(today.month)+sizeof(today.day)+sizeof(today.year));
printf("address of today = %p\n",&today);
printf("address of month = %p\n",&today.month);
printf("address of day = %p\n",&today.day);
printf("address of year = %p\n",&today.year);
printf("year - day = %lf\n",today.year-today.day);
printf("day - month = %lf\n",today.day-today.month);
return 0;
}
输出:
sizeof(today) = 24
sizeof(today.month+today.day+today.year) = 13
address of today = 000000000062FE00
address of month = 000000000062FE00
address of day = 000000000062FE08
address of year = 000000000062FE10
year - day = 44.000000
day - month = 5.000000
结构的sizeof是指结构整体所占空间的大小,由于结构中成员的排列顺序,数据是否对齐,造成与各个成员的sizeof之和并不相同。
结构内的成员之间不一定连续,相邻的成员的地址的差不一定等于对应的成员的sizeof,取决于成员所占空间大小与成员如何排列。