本篇为结构体指针专题(重点重点重点)
一,是什么?
结构体指针指的是指向结构体变量的指针!
二,为什么(要有)?
1,访问和修改结构体成员
2,传递大型结构体
复制大型结构体可能会消耗大量的时间和内存资源,而传递指针只需要复制一个内存地址。
3,动态内存分配
使用指针来分配和释放堆上的内存,这在创建动态大小的数据结构时非常有用。
4,函数返回多个值
在某些编程语言中,函数不能直接返回多个值。在这种情况下,可以通过返回一个结构体指针来间接返回多个值。
三,怎么做?
1,定义结构体指针
定义类型:struct 结构体名 * 结构体指针名(结构体名星结构体指针名)
struct books*struct_pointer
struct books*p
books 为结构体名 struct_pointer(p)为结构体指针名
定义之后可以在上述定义的指针变量中存储结构变量的地址
struct_pointer = &Book1;
p=&Book1;
定义结构体指针举例:
定义结构体的同时定义结构体指针:
2,结构体指针的使用
a 使用:指向结构体变量的指针
通过结构体指针可以获取结构体成员,有两种方法:
第一种:(*pointer).memberMane 星p点结构体成员
第二种: pointer->memberName p箭头结构体成员
我们为了使用指向该结构的指针访问结构的成员,一般使用->运算符多一点
原因:直观!
struct_pointer->title;
注意:
▶ 结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&符号,所以给p赋值只能写成p=&Book1的形式。
▶ 结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。(反复强调)
总的来说就是加上一个星P(*p),用的时候在取地址(动词)我们定义的结构体变量。
*p=&stu1
代码例子如下:
#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 使用:指向结构体数组的指针
#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 使用:结构体成员是指针类型变量
在使用时可以很好地防止内存被浪费,但是注意在引用时一定要给指针变量分配地址,如果你不分配地址,结果可能是对的,但是Name会被分配到任意的一的地址,结构体不为字符串分配任何内存存储空间具有不确定性,这样就存在潜在的危险。
如果我们定义了结构体指针变量,他没有指向一个结构体,那么这个结构体指针也是要分配内存初始化的,他所对应的指针类型结构体成员也要相应初始化分配内存
struct Student
{
char* Name;
int number;
char csex;
}stu,*stu;
stu = (struct student*)malloc(sizeof(struct student));./*结构体指针初始化*/
stu->name = (char*)malloc(sizeof(char));/*结构体指针的成员指针同样需要初始化*/
好了,去消化吧。。。