【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种写法,比较直观。

经验分享 程序员 微信小程序 职场和发展