APP下载

C程序中使用结构体变量和指针变量引用成员的教学探讨

2021-03-16吴昊朱林丽

中国管理信息化 2021年4期
关键词:成员

吴昊 朱林丽

[摘 要]本文主要对C程序中引用结构体类型数据中成员的一些方法做了比较详细的探讨,分析了使用结构体变量和指针变量引用成员的区别,并结合具体案例,让初学者对结构体成员的引用有进一步认识。

[关键词]C程序;结构体变量;指针变量;成员

doi:10.3969/j.issn.1673 - 0194.2021.04.105

[中图分类号]G642[文献标识码]A[文章编号]1673-0194(2021)04-0-02

0     引 言

结构体类型是C语言程序设计课程中比较重要的一种构造性数据类型,这种数据类型是由多个成员构成,一般用来定义结点型的数据类型。虽然结构体类型的数据中所有的成员是一个整体,但对成员不可以整体访问,只能单独访问。一般对成员的访问有两种方式,一种是使用“.”,一种是使用“->”。然而在实际的教学中,有许多学生容易混淆这两种引用方式,不能很好地理解结构体变量和结构体指针变量在访问成员时的具体指向,从而导致学生在编写涉及结构体数据类型的程序时遇到许多麻烦。为了帮助初学者在学习C语言程序设计这门课程时,能够对通过结构体变量引用成员和通过结构体指针变量引用成员这两种方式有更深的了解,本文将做比较详细的探讨。

1     结构体类型

1.1   结构体数据类型的声明

结构体数据类型与基本的数据类型(如整形、字符型、浮点型)是有区别的,基本的数据类型是由系统定义的,用户可以直接使用,而结构体数据类型是由用户根据解决问题的实际需要自己声明[2]。声明结构体数据类型的一般形式如下。

struct 结构体名

{ 成员表列 };

例如,一名學生包含学号、姓名、性别、年龄和专业等一些基本信息,则声明学生结构体数据类型如下。

struct  student

{

int  num;         //学号

char  name[10];   //姓名

char  sex;        //性别

int  age;         //年龄

char  pro[20];    //专业

};

1.2   结构体变量和结构体指针变量的定义

声明好结构体数据类型以后,就可以使用它来定义结构体变量或结构体指针变量。例如,利用上面已经声明好的学生结构体数据类型来定义结构体变量p和指针变量q的形式为:

struct  student  p, *q;

此外,还可以在声明类型的同时定义变量或指针变量,因此,利用学生结构体数据类型定义结构体变量p和指针变量q,还可以表示为:

struct  student

{

int  num;

char  name[10];

char  sex;

int  age;

char  pro[20];

} p, *q;

2     引用结构体数据成员的方法

定义好结构体变量或指针变量以后,就可以通过它们来引用结构体数据中的成员,引用结构体数据成员主要有以下3种方法。

2.1   通过结构体变量来引用成员

使用结构体变量来引用成员是通过“.”来实现的,且它引用的是自己的成员,如文中第二部分定义的p是一个结构体变量,引用结构体变量p中的成员可表示:p.num,p.name,p.sex,p.age,p.pro。

2.2   通过结构体指针变量和“->”来引用成员

结构体指针变量只能存储和它同类型的变量或存储单元的地址,它没有自己的成员,在使用结构体指针变量之前,必须把同类型的变量的地址或动态创建的同类型的存储单元(用malloc函数创建)的地址赋值给它,让它有所指向,否则使用结构体指针变量是无意义的。当结构体指针变量有指向以后,可以通过“->”来引用指针变量所指向的变量或存储单元中的成员。如文中第二部分定义的q是一个结构体指针变量,而p是一个结构体变量,如果把p的地址赋值给q(即q=& p),则可通过q来引用p中的成员,使用q来引用结构体变量p中的成员可表示为:q->num,q->name,q->sex,q->age,q->pro。

2.3   通过结构体指针变量和“.”来引用成员

当把变量的地址赋值给同类型的指针变量以后(指针变量指向该变量),“*指针变量”和“变量”的作用是一样的,如文中第二部分定义的变量p和指针变量q,如果把p的地址赋值给q(即q=& p),则*q的作用相当于p,使用q来引用结构体变量p中的成员可表示为:(*q).num,(*q).name,(*q).sex,(*q).age,(*q).pro。(注:在C语言程序中,由于“.”的优先级比“*”的优先级高,故*q外面的括号不可以省略)

3     具体的案例实现

以创建一个具有三个结点的单链表为例,分别介绍以结构体变量创建、结构体变量加指针变量创建以及结构体变量加动态开辟存储单元创建的3种情况,单链表的结点是一个结构体类型,主要包括整形的数据成员和指针成员,结点的结构体类型声明如下。

struct  node

{

int  data;

struct  node  *next;

};

3.1   结构体变量创建单链表

void main()

{

struct  node  a1,a2,a3;

scanf(“%d%d%d”,&a1.data, &a2.data, &a3.data);

a1.next=&a2;  //把a2链在a1的后面

a2.next=&a3;  //把a3链在a2的后面

a3.next=NULL; //最后一个结点的指针成员赋值为空

}

注:a1,a2,a3定义的是结构体变量,所以在程序中都是用“.”来引用成员

3.2   结构体变量加指针变量创建单链表

void main()

{

struct  node  a1,a2,a3,*t1,*t2,*t3;

t1=&a1;  t2=&a2;   t3=&a3;  //分別把a1、a2、a3的地址赋值给t1、t2、t3

scanf(“%d%d%d”,&t1->data, &t2->data, &t3->data);

t1->next=t2;  //把t2所指结点链在t1所指向结点之后

t2->next=t3;  //把t3所指结点链在t2所指向结点之后

t3->next=NULL; //最后一个结点的指针成员赋值为空

}

注:t1,t2,t3定义的是结构体指针变量,所以在程序中都是用“->”来引用成员

3.3   结构体变量加动态开辟存储单元创建单链表

void main()

{

/* h和r分别指向链表的头结点和最后一个结点,t指向新建的结点*/

struct  node  *t,*r,*h;

int  i=1;

while(i<=3)  //判断循环的次数

{

t=(* struct  node)malloc(sizeof(struct  node));  //新建一个结点

scanf(“%d”,&t->data);

if(i==1)  //如果创建的是第一个结点

{

h=r=t;  // h和r都指向该结点

continue;

}

r->next=t;  //把t所指向的结点插到r所指向结点的后面

r=t;    //让r重新指向链表中最后一个结点

}

r->next=NULL;  //最后一个结点的指针成员赋值为空

}

注:t,r,h定义的是结构体指针变量,所以在程序中都是用“->”来引用成员

以上3种方法虽然都可以创建一个具有三个结点的单链表,但不难发现,第一、第二两种方法在创建单链表时需要定义结构体变量,链表中有多少个结点就需要定义多少个结构体变量,而第三种方法不需要定义结构体变量,只需使用malloc函数创建结点即可,需要多少建多少,程序设计比前两种方法要灵活许多。

4     结 语

本文主要对C程序中使用结构体变量和指针变量来引用成员的两种情况做了较详细的分析和总结,在引用结构体成员时,一定要注意变量引用和指针变量引用两者之间的区别,即变量引用成员使用的是“.”,用的是自己的成员,而指针变量可以使用 “->”或 “(*指针变量).成员”的方式来引用它所指向的结构体变量或存储单元的成员,用的不是自己的成员。

主要参考文献

[1]谭浩强.C程序设计[M].第5版.北京:清华大学出版社,2017:309-314.

[2]王敬.用C语言结构体类型指针实现数据结构链表操作[J].数字技术与应用,2013(4):165-166.

猜你喜欢

成员
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介
主编及编委会成员简介