1.结构体的操作
1.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);
结构体名不是结构体变量的地址,必须使用&获取地址。
数组名即地址。
1.2传参
void Print(struct Point3D p){
printf("(%d,%d,%d)",p.x,p.y,p.z);
}
整个结构体作为参数的值传入函数。这时候在函数内新建一个结构体变量并复制值。结构体可以作为返回值,也是结构体整体复制。
1.3结构体指针
struct Point3D p = {1,2,3};
struct Point3D* q = &p;
- 结构体指针访问成员
结构体指针访问成员的方式与结构体变量访问成员的方式有区别。
结构体变量使用.和名字访问成员。
结构体指针使用->和名字访问成员。
格式
结构体指针->成员名
例如:
struct Point3D p = {1,2,3};
struct Point3D* q = &p;
printf("(%d,%d,%d)",q->x,q->y,q->z);
通过修改结构体指针q指向的成员,也会改变结构体变量p成员的值。
- 结构体指针作为参数
在C语言中,通常会将结构体指针作为参数传入函数,尤其是当传递的参数类型比地址大的时候,可以使用这种方式既能传递较少的字节数。
void Print(struct Point3D* p){
printf("(%d,%d,%d)",p->x,p->y,p->z);
}
1.4结构数组
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);
}
1.5结构体嵌套
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}}};