结构:
声明:struct 结构名{数据类型 变量名; 数据类型 变量名; 数据类型 变量名;};
它跟本地变量一样,如果在main函数里面进行声明,那么只能在main函数里使用,如果在main函数外声明,则可看成全局变量。
使用与定义: 举个例子,如果声明了 struct point{int year; int month; int day;}; ,那么使用时只需在所在的给他定义变量,例如: struct point today;意思就是定义了一个today的结构变量,而后续如果想用today结构变量中的值的话,形式如下: today.year;就是结构变量名+“.”运算符。
结构运算: 1.赋值运算:结构变量也要赋初始值,可以struct 结构名 变量名 ={0};就是将结构里的值全部赋为0。
还有一种形式就是可以只赋值结构里的部分变量,其余变量就和数组一样全部默认赋值为0。
两个结构变量之间的赋值,有结构变量名1=(struct 结构名){值1,值2} 意思就是 将结构变量1的两个值赋值为结构变量中的两个值。
还有一种就是 直接变量名1=变量名2,过程即直接将变量名2中的所有值赋值给变量名1.
2.取地址:它与数组不同,运用指针时,需要&运算符来定义指针,例如:struct 结构名 *指针名 = &变量名,意思是定义一个指向结构的一个结构变量的地址。
结构作为函数参数:整个结构可以作为参数的值传入函数,过程相当于在函数中新建一个结构变量,并赋值调用者的结构的值,它可以返回一个值,也可以返回一个结构。
如何用scanf传入结构的值:1.构造一个结构函数,给函数传入值是void,中间创造一个中间结构,传出这个结构,主函数的结构调用这个函数就可以了。
struct point inputPoint()
{
struct point temp;
scanf("%d %d",&temp.x,&temp.y};
return temp;
}
void main()
{
struct point y={0,0};
y= inputPoint();
}
2.运用结构指针:构造一个指向结构的指针,传入这个结构指针参数进入函数,最后返回这个结构就可以了。这里有个小知识:可以用‘->’表示指针所指的结构变量中的成员。
#include<stdio.h>
struct point
{
int x;
int y;
};
struct point*inputPoint(struct point*p)
{
scanf("%d",&p->x);
scanf("%d",&p->y);
return p;
}
int main(void)
{
struct point y={0,0};
inputPoint(&y);
printf("%d %d",y.x,y.y);
}
结构的嵌套:
结构中的结构的数组:
#include <stdio.h>
struct point{
int x;
int y;
};
struct rectangle {
struct point p1;
struct point p2;
};
void printRect(struct rectangle r)
{
printf("<%d, %d> to <%d, %d>\n", r.p1.x, r.p1.y, r.p2.x, r.p2.y);
}
int main(int argc, char const *argv[])
{
int i;
struct rectangle rects[ ] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}}; // 2 rectangles
for(i=0;i<2;i++) printRect(rects[i]);
}