【C语言入门教程】7.3结构体指针的定义和引用

【C语⾔⼊门教程】7.3结构指针的定义和引⽤
C 语⾔中指针的操作⾮常灵活,它也能指向结构体变量对结构体变量进⾏操作。在学习结构指针之前,需要再次加深对指针的认识。声明指针变量时所使⽤的数据类型修饰符实际上的作⽤是定义指针访问内存的范围,如果指针定义为整型,那么该指针访问内存的范围就是整型变量在内存中所占⽤的空间⼤⼩。虽然每次尝试将指针变量所在存储的内存地址输出会发现,任何类型的内存地址长度都⼀样,但不同类型间不能相互复制,只有空值型除外。因此在使⽤指针操作结构体时,⼀定要确定指针所定义的数据类型与结构体的数据类型相同。
7.3.1 指向结构体类型变量的使⽤
定义结构体变量的⼀般形式是:
结构体名 *结构体变量名
结构体名作为指针变量的类型修饰符。引⽤结构体指针所指向的结构体变量成员需要使⽤“->”操作符,该操作中减号“-”和⼩于号“>”组合⽽成。如下例⼦所⽰:
typedef struct student stu_t;    // 将结构体 student 定义为数据类型
stu_t stu1 = {"Tom", "Math", 20090001, 87.5, 70.5, 93, 91}; // 定义结构体并初始化
stu_t *p;            // 定义结构体指针
p = &stu1;            // 将结构体变量地址赋给指针
p->no = 20090005;    // 引⽤指针所指向结构体变量的成员
代码中使⽤了 typedef 命令,该命令⽤于定义新的数据类型修饰符。执⾏ typedef 命令后,stu_t 成为了 student 结构体类型修饰符,在代码中 stu_t 的作⽤等同于 struct student。指针 *p 被指向结构体变量 stu1,但指针 *p 并不是结构体变量,所以不能使⽤“.”符号引⽤结构体成员,只能使⽤“->”操作符。
gm码
在设计⼀些需要⼤量交换数据的程序时,需要动态为数据划分内存。当不再需要该数据时,可以从内存中释放,以节省程序运⾏时占⽤的内存空间。下例将演⽰为结构体指针动态分配内存的操作⽅法。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
typedef struct student stu_t;
struct student
{
int no;
};
stu_t *p = (stu_t *)malloc(sizeof(stu_t));
p->no = 2009;
printf("%d", p->no);
free(p);中国土布网
return 0;
}
在为结构体动态分配内存空间时,使⽤ sizeof()函数计算结构体 stu_t 在内存中所需要的空间,然后使⽤ malloc() 函数将 sizeof() 函数返回的数量在内存中划分出来,malloc() 函数的返回值是该内存空间的⾸地址,所以⽤强制转换表达式“(stu_t *)”将 malloc() 返回的地址转换为stu_t 类型的指针。
7.3.2 指向结构体类型数组的指针的使⽤
结构体类型数组本质上是作为数组存在,数组的元素是结构体变量。结构体数组的名称即是指向该数组第⼀个数组元素的指针。结构体数组元素之间不能直接相互复制数据,下⾯将介绍通过指针直接访问内存空间复制结构体数组元素的⽅法。
#include <string.h>
#include <stdio.h>
int main(void)
{
typedef struct student stu_t;
2003赤裸天使
struct student
{
char name[60];
char dept[50];
long no;
float score[4];
};
stu_t stu_a[2] = {"TOM", "Math", 2009001, 87.5, 70.5, 93, 91}; // 初始化结构体数组第 1 个元素
stu_t *p = stu_a;    // 为结构体指针划分内存空间
memcpy(p + 1, p, sizeof(stu_t)); // 将数组第 1 个元素复制给数组第 2 个元素
puts((p + 1)->name);    // ⽤指针引⽤数组第 2 个元素的数组成员
return 0;视频直播服务器
你对学校减负工作有什么建议
}
程序中定义了结构体数组 stu_a,在初始化时为其第 1 个元素赋值。定义指针 *p 时,⽤数组名stu_a 为指针 *p 赋值,指针 *p 指向了数组stu_a 第 1 个元素。memcpy() 函数的作⽤是将内存中从指针 *p 指向的地址开始长度为 sizeof(stu_t)的数据,复制到内存中指针 *p +
1 指向的地址开始长度为 sizeof(stu_t) 的空间⾥。由此可见,对指针 *p + 1 进⾏的操作,并⾮简单的将内存地址作为整型数据进⾏加 1 运算,1 代表的是 sizeof(stu_t) 的长度的内存区间所跨越地址的差值。
首都医科大学学报

本文发布于:2024-09-24 02:31:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/361250.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   指针   变量
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议