【C语言】结构体指针
时间:2024-03-25 15:01:04 来源:网络cs 作者:往北 栏目:广告工具 阅读:
结构体指针
结构体基础知识注意对于成员的赋值 结构体指针指向结构体变量的指针结构体指针与结构体成员指针用结构体指针引用结构体成员
结构体
基础知识
初识结构体,可以先看这篇浅显易懂的文章结构体–基础篇
所谓结构体
,是一组类型
可以不同的相关变量
(或数组)的集合。
构成结构体的变量
(或数组)称为结构体的成员
。
C语言要求,在定义结构体
变量时,需要明确给定每个
成员的名字
和类型
。
声明一种·结构体类型
,需要定义一个标识符
,这种标识符称为结构体类型
标识符。
struct student{ char name[20]; char num[11]; int age; float score;};//student 是结构体类型的标识符 //struct student 是一种结构体类型
对于结构体变量的成员
可以进行哪些操作,取决于结构体变量的成员是哪种类型
的。因为结构体
变量的成员在本质上也是变量(或数组),所以对于结构体
变量成员
的操作,与同类型
变量(或数组)的操作是相同
的。
注意对于成员的赋值
我们先来看一个错误的程序:
#include <stdio.h>struct student {char name[20];char num[20];int score;};int main (void){struct student stu;stu.score=99;stu.name="Lin hui";stu.num="S2208017";printf("%d,%s,%s\n",stu.score,stu.name,stu.num);return 0;}
编译系统会报错,这是为什么呢?
该程序编译时,将会产生“给数组名赋值”的错误。
这是因为结构体变量stu的两个成员num和name均为字符数组
。
而数组名属于指针常量
,因而不能对数组名
进行赋值。
那么,如何才能将字符串
存放如字符数组
成员中呢?我们可以利用strcpy
函数。
正确的程序:
#include <stdio.h>#include <string.h>struct student {char name[20];char num[20];int score;};int main (void){struct student stu;stu.score=99;strcpy(stu.name,"Linhui");strcpy(stu.num,"S2208017");printf("%d,%s,%s\n",stu.score,stu.name,stu.num);return 0;}
结构体指针
指针的基本功能就是间接引用
,也就是通过指针变量
间接地引用另一个
变量。
为什么要使用
指针
呢?
指针的独特优势在于,在C语言中的某些功能只能借助于间接引用
才能实现。
例如,局部变量的跨函数
改写,就只能通过间接引用
才能实现。
同样地,结构体指针
的功能就是间接地引用
结构体变量。
而C语言中的某些功能(例如动态链表)就必须借助于结构体指针
才能实现。
指向结构体变量的指针
struct student //声明结构体类型{ char name[20]; char num[20]; int age; int score;};struct student stu;//定义结构体类型的变量stustruct *p;//定义指向结构体变量的指针变量pp=&stu;//赋初值
结构体指针与结构体成员指针
一旦定义了指向结构体变量
的指针,就可以通过该指针间接
引用所指向
的结构体变量。
p=&stu;
那么,就可以用*p来间接引用
结构体变量stu;
上述是把结构体变量的首地址赋值给指针变量p,所以结构体指针变量p指向了结构体变量stu。
例:
虽然结构体指针
和结构体第一个成员的地址值相同,但结构体指针
和结构体成员指针
的含义是不同的。
struct student *p;*p=stu;int *p1=stu.num;
虽然p和p1的值是相同的,都是2000H。但是p是指向结构体类型变量的指针,而p1是指向int型变量的指针。若执行p++,则p的值为2043H,而执行p1++,p1的值为2002H。
用结构体指针引用结构体成员
既然可以利用结构体指针
引用结构体变量
,当然也可以引用结构体变量的成员
。
其一般形式为:
(*结构体指针变量).成员名
需要注意,这里的括号
必不可少。如果去掉括号后:
*结构体指针变量.成员名
由于成员运算符
“.”的优先级高于间接引用运算符
"*",所以上式即为:
*(结构体指针变量.成员名)
而指针变量不可能有成员,从而导致语法错误。
例:
从键盘输入一个学生的学号、姓名、年龄和成绩,并存入一个结构体变量
中,然后依次输出各项数据。要求通过结构体指针``间接引用该结构体变量的
成员`。
#include <stdio.h>struct student //定义结构体类型说明符 student{ char num[20]; char name[20]; int age; float score;};int main (void){ struct student stu,*p=&stu; gets((*p).num);//输入学号 gets((*p).name);//输入姓名 scanf("%d",&(*p).age);//输入年龄 scanf("%f",&(*p).score);//输入成绩 printf("学号\t姓名\t年龄\t成绩\n"); printf("%s\t%s\t%d\t%.2f\n",(*p).num,(*p).name,(*p).age,(*p).score); return 0;}
上述间接引用形式比较直观,但略显繁琐,故C语言提供了另一种更加简洁的·引用形式。
其一般形式为:
结构体指针变量->成员名
此处的“- >”
称为指向
运算符。
其功能等价于:
(*结构体指针变量).成员名
让我们再来以这种方式做一下上面的题目:
从键盘输入一个学生的学号、姓名、年龄和成绩,并存入一个结构体变量
中,然后依次输出各项数据。要求通过结构体指针``间接引用该结构体变量的
成员`。
#include <stdio.h>struct student //定义结构体类型说明符{ char num[20]; char name[20]; int age; float score;};int main (void){ struct student stu,*p=&stu; gets(p->num); gets(p->name); scanf("%d",&p->age); scanf("%f",&p->score); printf("学号\t姓名\t年龄\t成绩\n"); printf("%s\t%s\t%d\t%.2f\n",p->num,p->name,p->age,p->score); return 0;}
本文链接:https://www.kjpai.cn/news/2024-03-25/148429.html,文章来源:网络cs,作者:往北,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
上一篇:【c++初阶】C++入门(下)
下一篇:返回列表