结构体和数据结构--结构体指针的定义和初始化

目录

一、指向结构体变量的指针

二、指向结构体数组的指针


一、指向结构体变量的指针

        如上一文章的例题,假设已经声明了STUDENT结构体类型,那么定义一个指向该结构体类型的指针变量的方法为:

STUDENT *pt;//定义指向STUDENT结构体的指针变量

        这里只是定义了一个指向STUDENTJ结构体类型的指针变量pt,但是此时的pt并没有指向一个确定的存储单元,其值是一个随机值。为使pt指向一个确定的存储单元,需要对指针变量进行初始化。

例如,下面这句:pt  =  &stu1;//让结构体指针变量pt指向结构体变量stu1

使指针pt指向结构体变量stu1所占内存空间的首地址,即pt是指向结构体变量stu1的指针。

        当然也可以在定义指针变量pt的同时对其进行初始化,使其指向结构体变量stu1的指针。

例如:STUDENT *pt = &stu1;//定义指向STUDENT结构体的指针变量并对其进行初始化。

        如何访问结构体指针变量所指向的结构体成员呢?一种是使用成员选择运算符,也称为圆点运算符;另一种是使用指向运算符,也称为箭头运算符,其标准形式如下:

        指向结构体的指针变量->成员名

例如 ,若要访问结构体指针变量pt指向的结构体的studentID成员,则需要使用下面的语句:

pt->studentID = 100310121;

它与下面的语句是等价的。

(*pt).studentID = 100310121;//这种方式不常用

因()的优先级比成员选择运算符的优先级高,所以先将(*pt)作为一个整体,取出pt指向的结构体的内容,再将其看成一个结构体变量,利用成员选择运算符访问它的成员。再如,若要访问结构体指针变量pt指向的结构体的birthday成员,则需要使用下面的语句:

pt->birthday.year = 1991;

pt->birthday.month =  5;

pt->birthday.day   =  19;

二、指向结构体数组的指针

        假设以声明了STUDENT结构体类型,并且已定义了一个有30个元素的结构体数组stu,则定义结构体指针变量pt并将其指向结构体数组stu的方法为:

 STUDENT * pt = stu;

它与下面的语句是等价的:

STUDENT * pt  = &stu[0];

同时,也等价于下面的语句:

STUDENT *pt;

pt   =   stu ;

        如下图所示,由于pt指向了STUDENT结构体数组stu的第一个元素stu[0]的首地址,因此,可以用指向运算符来引用pt指向的结构体成员。例如,pt->score[0] 引用的是stu[0].score[0]的值,即表示第一个学生的成绩。而p+1指向的是下一个结构体数组元素stu[1]的首地址,pt+2指向的是stu[2]的首地址,以此类推。 

 例题:模拟使用箭头运算符访问结构体数据。

#include <stdio.h>

typedef struct date
{
	int year;
	int month;
	int day;
}DATE;

typedef struct student
{
	long studentID;
	char studentName[10];
	char studentSex;
	DATE birthday;
	int score[4];
}STUDENT;

int main(void)
{
	STUDENT stu1={100310121,"王刚",'M',{1991,5,19},{91,83,79,99}};
	STUDENT stu2={100310122,"王",'F',{1992,6,13},{99,100,70,94}};
	STUDENT *tp = &stu1;
	printf("Name :%10ld\n",tp->studentID);
	printf("score[2] :%d\n",tp->score[2]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值