指向结构体的指针用法(结构体使用与指针的理解)
以前总有一种疑惑。为什么结构体的指针有的需要用分配空间?有的不需要分配空间呢?现在总结一下思路:
一:关于结构体的定义问题:使用结构体一般会使用变量或者定义指针
typedefstruct{
inta;
intb;
}data;
使用这个结构体的两种方式:
- data datas 直接引用。这样使用类似于int a 这种模式。data类似于一个类型(如:int)这样的话,在使用的时候,系统自动会为这个类型分配空间。在栈上进行分配,在使用完成后会自动释放。
- data *dates 指针调用。定义一个data类型的指针。使用这种指针需要做的是分配空间和释放空间以及初始化。人为的进行分配和释放,这部分空间一般会位于堆的位置。你也可以让指针直接指向已经存在的空间。
typedefstruct{
inta;
intb;
}date;
staticintintcms(void*para){
intc=((date*)para)->a;
printf("cis%d\n",c);
}
intmain(intargc,char**argv)
{
datedates;
dates.a=9;
dates.b=2;
intcms(&dates);
}
上述调用中采用的结构体变量。在传入函数时通过指针void *para指针传递过去。需要注意的是不能直接使用para->a来访问结构体的成员。为什么呢。这是因为para只是接收过来的地址。para虽然指向的结构体的首地址。但是这个指针并不知道自己指向的是什么内容和有多少成员。需要(date *)para强制转化一下。这样para就可以知道自己是什么类型的指针。有多少成员。
typedefstruct{
inta;
intb;
}date;
staticintintcms(void*para){
intc=((date*)para)->a;
printf("cis%d\n",c);
}
intmain(intargc,char**argv)
{
date*dates=(date*)malloc(sizeof(date));
dates->a=9;
dates->=2;
intcms(dates);
free(dates);
}
上述代码使用结构体指针需要分配空间和释放空间。这是堆的使用。如果你不释放。在整个进程结束的时候。系统有会自动回收。简单的程序没什么问题。但是在需要分配大量的空间就可能导致出资源浪费或者内存耗尽的情况
三:结构体定义的几种方法
#include<stdio.h>
#include<string.h>
#include<malloc.h>
/*先定义几类结构体*/
structstr{
inta;
intb;
}str1;
/*这是第一类结构体的形式,有结构体名,有结构体变量*/
structstr2{
inta;
intb;
};
/*这是第二类结构体的形式,有结构体名,无结构体变量*/
typedefstruct{
inta;
intb;
}STR3;
/*这是第三类结构体的形式,把结构体重定义为STR3*/
typedefstructstr4{
inta;
intb;
}STR4;
/*这是第四类结构体的形式,把结构体重定义为STR4,还有结构体名称*/
voidmain()
{
/*定义各类的指针*/
structstr*p;
structstr2*p2;
STR3*p3;
structstr4*p4;
STR4*p5;
/*-----------------------------------------------*/
p=&str1;/*结构体指针指向结构体变量的地址首地址*/
p->a=1;
p->b=2;
printf("p->a=%d,p->b=%d\n",p->a,p->b);
/*-----------------------------------------------*/
p2=(structstr2*)malloc(sizeof(structstr2));/*为结构体指针分配对应结构体类型的大小的首地址*/
p2->a=1;
p2->b=2;
printf("p2->a=%d,p2->b=%d\n",p2->a,p2->b);
/*-----------------------------------------------*/
p3=(STR3*)malloc(sizeof(STR3));/*为结构体指针分配对应结构体类型的大小的首地址*/
p3->a=1;
p3->b=2;
printf("p3->a=%d,p3->b=%d\n",p3->a,p3->b);
/*-----------------------------------------------*/
p4=(structstr4*)malloc(sizeof(structstr4));/*为结构体指针分配对应结构体类型的大小的首地址*/
p4->a=1;
p4->b=2;
printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
structstr4str4a;
p4=&str4a;/*结构体指针指向结构体变量的地址的首地址*/
p4->a=1;
p4->b=2;
printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
/*--------------------------------------------------*/
/*-----------------------------------------------*/
p5=(STR4*)malloc(sizeof(STR4));/*为结构体指针分配对应结构体类型的大小的首地址*/
p5->a=1;
p5->b=2;
printf("p5->a=%d,p5->b=%d\n",p5->a,p5->b);
p5=&str4a;/*结构体指针指向结构体变量的地址的首地址*/
p5->a=1;
p5->b=2;
printf("p5->a=%d,p5->b=%d\n",p5->a,p5->b);
/*--------------------------------------------------*/
}
运行结果如下:
本文参考:
https://blog.csdn.net/weixin_36209467/article/details/82261286
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com