【C语言】结构体指针
C语言之结构体指针
结构体指针,即为指向一种结构体类型的指针。
1.一般定义法
struct student
{
int num;
int grade;
} ;
struct student *p_student; //定义了一个指向struct student类型结构的指针。
结构体指针p_student可以指向任一属于struct student类型结构的的结构体变量。
2.加上typedef关键字后
typedef struct student
{
int num;
int grade;
} *p_stu;
p_stu为指向__“struct student 结构体类型”的“结构体指针类型”__的别名;此时的p_stu不再是具体的一个结构体指针,而是指向struct student结构体类型的“结构体指针”这个数据类型的别名。
我们可以使用p_stu来定义具体的结构体指针变量,让其指向struct student结构体类型的结构体变量。 例:
#include "stdio.h"
typedef struct student
{
int num;
int grade;
} *p_stu;
struct student student_1=
{
.num=1,
.grade=90,
};
p_stu p_student_1=&student_1;
int main(void)
{
printf("student_1.num=%d
",p_student_1->grade);//用结构体指针访问成员的第1种方法
printf("student_1.num=%d
",(*p_student_1).grade);//用结构体指针访问成员的第2种方法
return 0;
}
程序运行结果: 注意:与数组不同,结构体变量名并不是结构的地址,因此需要在结构体变量名前加&运算符。 上面的定义方式等价于
typedef struct student
{
int num;
int grade;
} ;
typedef struct student *p_stu;//此时p_stu为指向“struct student结构体类型”的“结构体指针类型”的别名。
3.利用“结构体指针”调用其所指向的结构体变量的成员
利用“结构体指针变量”调用其所指向的结构体变量的成员,写法有二:
3.1 写法1
(*pointer).memberName
这种写法中,.的优先级高于*,(pointer)两边的括号不能少。如果去掉括号写作pointer.memberName,那么就等效于*(pointer.memberName),这样意义就完全不对了。
3.2 写法2
pointer->memberName
此种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。 两种写法,我们通常选择第2种写法,比较直观。
