结构体使用与指针的理解

以前总有一种疑惑。为什么结构体的指针有的需要用分配空间有的不需要分配空间呢?现在总结一下思路:

一:关于结构体的定义问题:使用结构体一般会使用变量或者定义指针

typedef struct{
int a;
int b;
}data;

使用这个结构体的两种方式:

  1. data datas 直接引用。这样使用类似于int a 这种模式。data类似于一个类型(如:int)这样的话,在使用的时候,系统自动会为这个类型分配空间。在栈上进行分配,在使用完成后会自动释放。
  2. data *dates 指针调用。定义一个data类型的指针。使用这种指针需要做的是分配空间和释放空间以及初始化。人为的进行分配和释放,这部分空间一般会位于堆的位置。你也可以让指针直接指向已经存在的空间。

二:关于结构体指针的传递和调用的用法:


 typedef struct{
  int a;
  int b;
  }date;
 static int intcms(void *para){
     int c = ((date *)para)->a;
     printf("c is %d\n",c);
 }
  
 int main(int argc, char **argv)
 {
     date dates;
     dates.a = 9;
     dates.b = 2;
     intcms(&dates);
}

上述调用中采用的结构体变量。在传入函数时通过指针void *para指针传递过去。需要注意的是不能直接使用para->a来访问结构体的成员。为什么呢。这是因为para只是接收过来的地址。para虽然指向的结构体的首地址。但是这个指针并不知道自己指向的是什么内容和有多少成员。需要(date *)para强制转化一下。这样para就可以知道自己是什么类型的指针。有多少成员。

typedef struct{
  int a;
  int b;
  }date;
 static int intcms(void *para){
     int c = ((date *)para)->a;
     printf("c is %d\n",c);
 }
  
 int main(int argc, 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>
/*先定义几类结构体*/
struct str{
int a;
int b;
}str1;
/*这是第一类结构体的形式,有结构体名,有结构体变量*/
struct str2{
int a;
int b;
};
/* 这是第二类结构体的形式,有结构体名,无结构体变量 */
typedef struct {
int a;
int b;
}STR3;
/* 这是第三类结构体的形式,把结构体重定义为STR3 */
typedef struct str4{
int a;
int b;
}STR4;
/*这是第四类结构体的形式,把结构体重定义为STR4,还有结构体名称*/
void main()
{
	/*定义各类的指针*/
	struct str *p;
	struct str2 *p2;
	STR3 *p3;
	struct str4 *p4;
	STR4 *p5;
	/*-----------------------------------------------*/
	p = &str1; /*结构体指针指向结构体变量的地址首地址*/
	p->a=1;
	p->b=2;
	printf("p->a=%d,p->b=%d\n",p->a,p->b);
	/*-----------------------------------------------*/
	p2 = (struct str2 *)malloc(sizeof(struct str2)); /*为结构体指针分配对应结构体类型的大小的首地址*/
	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 = (struct str4 *)malloc(sizeof(struct str4));/*为结构体指针分配对应结构体类型的大小的首地址*/
	p4->a=1;
	p4->b=2;
	printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
	
	struct str4 str4a;
	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);
	/*--------------------------------------------------*/
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值