结构体指针的定义和使用如下:
定义结构体指针
结构体指针的定义形式一般为:
```c
struct 结构体名 *变量名;
```
例如,定义一个指向结构体 `stu` 的指针变量 `pstu`:
```c
struct stu {
char *name; // 姓名
int num; // 学号
int age; // 年龄
char group; // 所在小组
float score; // 成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
struct stu *pstu = &stu1;
```
或者可以在定义结构体的同时定义结构体指针:
```c
struct stu {
char *name; // 姓名
int num; // 学号
int age; // 年龄
char group; // 所在小组
float score; // 成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
```
使用结构体指针
访问结构体成员
通过结构体指针访问结构体成员有两种形式:
`(*pointer).memberName`
`pointer->memberName`
第一种写法中,`.` 的优先级高于 `*`,因此 `(*pointer)` 两边的括号不能少。如果去掉括号写作 `*pointer.memberName` 是错误的。
例如:
```c
struct num {
int i;
float j;
};
struct num *p = &num1;
p->i = 10; // 通过指针访问结构体成员
printf("num1.i=%d\n", num1.i); // 输出: num1.i=10
printf("num1.j=%f\n", num1.j); // 输出: num1.j=0.1
```
传递结构体变量的地址给函数
结构体指针可以用于传递结构体变量的地址给函数,这样函数内部可以直接操作结构体变量。
例如:
```c
void study_c(struct num *p) {
p->i = 10;
p->j = 0.1;
printf("num1.i=%d\n", p->i);
printf("num1.j=%f\n", p->j);
}
int main() {
struct num num1;
struct num *p = &num1;
study_c(p);
return 0;
}
```
存储另一个结构体变量的地址
结构体指针可以存储另一个结构体变量的地址,从而创建链表结构。
例如:
```c
typedef struct {
int *base;
int *top;
int stacksize;
} sqstack;
sqstack *stack = (sqstack *)malloc(sizeof(sqstack));
stack->base = (int *)malloc(100 * sizeof(int));
stack->top = stack->base;
stack->stacksize = 100;
```
注意事项
结构体指针必须指向一个确定的结构体变量 ,如:`p = &a;`
通过结构体变量的指针访问结构体的方法为:
`a.num`, `(*p).num`, `p->num`
示例代码
```c
include
include
struct num {
int i;
float j;
};
void study_c(struct num *p) {
p->i = 10;
p->j = 0.1;
printf("num1.i=%d\n", p->i);
printf("num1.j=%f\n", p->j);
}
int main() {
struct num num1;
struct num *p = &num1;
study_c(p);
struct Test {
int a;
char ch;
};
struct Test t;
struct Test *p2 = &t;