一.结构体操作
1.取地址
struct Point3D{
int x;
int y;
int z;
};
struct Point3D p = {1,2,3};
printf("&p = %p\n",&p);
printf("&(p.x) = %p\n",&p.x);
printf("&(p.y) = %p\n",&p.y);
printf("&(p.z) = %p\n",&p.z);
结构体名不是结构体变量的地址,必须使用&
获取地址。
数组名即地址。
2.传参
void Print(struct Point3D p){
printf("(%d,%d,%d)",p.x,p.y,p.z);
}
整个结构体作为参数的值传入函数。这时候在函数内新建一个结构体变量并复制值。结构体可以作为返回值,也是结构体整体复制。
二.结构体指针
struct Point3D p = {1,2,3};
struct Point3D* q = &p;
1.结构体指针访问成员
结构体变量使用
.
和名字访问成员。
结构体指针使用->
和名字访问成员。
struct Point3D p = {1,2,3};
struct Point3D* q = &p;
printf("(%d,%d,%d)",q->x,q->y,q->z); // 等同于printf("(%d,%d,%d)",(*q).x,(*q).y,(*q).z);
通过修改结构体指针q
指向的成员,也会改变结构体变量p
成员的值。
2.结构体指针作为参数
void Print(struct Point3D* p){
printf("(%d,%d,%d)",p->x,p->y,p->z);// 等同于printf("(%d,%d,%d)",(*q).x,(*q).y,(*q).z);
}
三.结构数组
struct Point3D ps[] = {{1,2,3},{1,1,1},{0,0,0}};
for(int i=0;i<3;++i){
printf("(%d,%d,%d)\n",ps[i].x,ps[i].y,ps[i].z);
}
四.结构体嵌套
struct Line{
struct Point3D start;
struct Point3D end;
};
struct Line line = {{1,1,1},{0,0,0}};
// 使用
printf("(%d,%d,%d)~(%d,%d,%d)",
line.start.x,line.start.y,line.start.z,
line.end.x,line.end.y,line.end.z);
struct Line* p = &line;
printf("(%d,%d,%d)~(%d,%d,%d)",
p->start.x,p->start.y,p->start.z,
p->end.x,p->end.y,p->end.z);
结构体含有结构体数组:
struct Triangle{
struct Point3D p[3];
};
struct Triangle t = {{{1,2,3},{1,1,1},{0,0,0}}};