结构体使用与指针的理解

李肖遥 2021-04-17

关注、星标公众号,直达精彩内容

来源|整理:技术让梦想更伟大


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

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

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);
 /*--------------------------------------------------*/
}

运行结果如下:

本文参考:

https://blog.csdn.net/weixin_36209467/article/details/82261286

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

推荐阅读:


     
             
嵌入式编程专辑
Linux 学习专辑
C/C++编程专辑
Qt进阶学习专辑

 关注公众号『技术让梦想更伟大』,后台回复关键字:『Qt』『C语言基础』『C语言难点』『C++』『Linux』『freertos』『指针』『数据结构与算法』『经验技巧篇』『疑问篇』『基础理论篇』『实战篇』『架构篇』『模块化编程』『状态机』『实用工具』『心声社区』『期刊』『视频』······等,查看更多精选内容。 


关注我的微信公众号,回复“加群”按规则加入技术交流群。


这是我另一个技术号,程序员的编程学习基地,注重编程思想,欢迎关注!


点击“阅读原文”查看更多分享。

李肖遥 公众号“技术让梦想更伟大”,作者:李肖遥,专注嵌入式,只推荐适合你的博文,干货,技术心得,与君共勉。
评论
热门推荐
相关推荐
X
广告
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦