欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【C语言】结构体(三)

【C语言】结构体(三)

2025/2/22 5:08:22 来源:https://blog.csdn.net/Hugh_215/article/details/144203641  浏览:    关键词:【C语言】结构体(三)

本篇为结构体指针专题(重点重点重点)

一,是什么?

结构体指针指的是指向结构体变量的指针!

二,为什么(要有)?

1,访问和修改结构体成员

2,传递大型结构体

复制大型结构体可能会消耗大量的时间和内存资源,而传递指针只需要复制一个内存地址。

3,动态内存分配

使用指针来分配和释放堆上的内存,这在创建动态大小的数据结构时非常有用。

4,函数返回多个值

在某些编程语言中,函数不能直接返回多个值。在这种情况下,可以通过返回一个结构体指针来间接返回多个值

三,怎么做?

1,定义结构体指针

定义类型:struct 结构体名 * 结构体指针名(结构体名结构体指针名

struct books*struct_pointer 

struct books*p

books 为结构体名   struct_pointer(p)为结构体指针名

定义之后可以在上述定义的指针变量中存储结构变量的地址

struct_pointer = &Book1;

p=&Book1;

定义结构体指针举例:

7239cea29a0a4c1fa9d3b996e44943cb.png

定义结构体的同时定义结构体指针:

5e0f05aa8f75436aaae5c274c87c67b6.png

2,结构体指针的使用

a 使用:指向结构体变量的指针

通过结构体指针可以获取结构体成员,有两种方法

第一种:(*pointer).memberMane   星p结构体成员

第二种:   pointer->memberName   p箭头结构体成员

我们为了使用指向该结构的指针访问结构的成员,一般使用->运算符多一点

原因:直观!

struct_pointer->title;

注意:

▶ 结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&符号,所以给p赋值只能写成p=&Book1的形式。

▶ 结构体和结构体变量是两个不同的概念:结构体一种数据类型一种创建变量的模,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量包含实实在在的数据,才需要内存来存储(反复强调)

总的来说就是加上一个星P(*p),用的时候在取地址(动词)我们定义的结构体变量

*p=&stu1

代码例子如下:

d317fb0f2e534775b5093c3fb0f6def6.png

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{char name[20];int num;int age;char group;float score;
}stu1 = { "Tom",12,18,'A',136.5 }, * pstu = &stu1;
int main()
{// 读取结构体成员的值printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);return 0;
}

b 使用:指向结构体数组的指针

37d9fbae5ec44682bc30f0265871880f.png

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct stu    //结构体类型 或结构体名
{char name[20];int num;int age;   //结构体成员char group;float score;
}stus[]{           //结构体数组{"Zhou ping", 5, 18, 'C', 145.0},{"Zhang ping", 4, 19, 'A', 130.5},{"Liu fang", 1, 18, 'A', 148.5},{"Cheng ling", 2, 17, 'F', 139.0},{"Wang ming", 3, 17, 'B', 144.5}
}, * ps;   //结构体指针
int main()
{//求数组长度 : sieof(结构体变量)/sizeof(结构体类型名)int len = sizeof(stus) / sizeof(struct stu);printf("Name\t\tNum\tAge\tGroup\tScore\t\n");for (ps = stus; ps < stus + len; ps++){printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);}return 0;
}

c 使用:结构体成员是指针类型变量

b35055a132bb4c6a9b2d17b2120ea965.png

在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险。

如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存

struct Student
{
     char* Name;
     int number;
    char csex;  
}stu,*stu;
stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
  stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/  
 

好了,去消化吧。。。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词