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

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

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
#include
#include
/*先定义几类结构体*/
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);/*--------------------------------------------------*/
}

运行结果如下:

声明:

本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

C语言结构体使用与指针的理解相关推荐

  1. c语言2个字符串可以相互赋值吗,c语言结构体2之变量赋值于字符串

    #include #include struct dangdang { char email[]; char name[]; char addr[]; int num; int bugnum; cha ...

  2. go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  3. C语言结构体指针的使用方法

    1.首先定义一个结构体,给它取别名: typedef struct node{ struct node * next://指向下一节点 int data://数据域 }pnode,*linklist; ...

  4. C语言 | 结构体指针

    C语言指向结构体变量的指针 在C语言中,指向结构体对象的指针变量既可以指向结构体变量,也可指向结构体数组中的元素. 指针变量的基类型必须与结构体变量的类型相同. C语言中允许 (*p).num用p-& ...

  5. C语言:结构体中一级指针和二级指针的创建与释放示例

    http://blog.csdn.net/Bixiwen_liu/article/details/53610952 这几天把C语言巩固了一下,作为一门最基本的编程语言,C语言还是相当基础和非常重要的, ...

  6. 【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

    参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment ...

  7. python 结构体指针_C语言结构体指针(指向结构体的指针)详解

    当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...

  8. 结构体自定义指针函数c语言,C语言结构体中的函数指针

    C语言结构体中的函数指针 C语言结构体中的函数指针内容由小编收集整理,希望对您的 学习有所帮助!更多内容请关注应届毕业生考试网! 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准 ...

  9. C语言结构体和结构体指针的简单用法

    C语言结构体和结构体指针的简单用法 这里总结一下自己的学习笔记,关于C语言当中的结构体指针的用法,以及结构体简单使用. 简单介绍一下今天出场的嘉宾–>结构体和结构体指针 什么是结构体: 1,定义 ...

最新文章

  1. 下面算法中,不属于公开密钥加密算法的是()。D
  2. Markdown拾遗
  3. LBS应用的路径引导方法
  4. POJ 1523 SPF
  5. 数据单位:bit、Byte、KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB、、、
  6. 初识Qt Creator
  7. 带你深入探究云原生时代的分布式操作系统 Kubernetes
  8. auto.js停止所有线程_多线程快速入门(二)及面试题
  9. linux漏洞知乎_Linux本地内核提权漏洞(CVE-2019-13272)
  10. [转载]DevOps建立全生命周期管理
  11. Python进阶之八皇后算法
  12. Onvif协议学习:11、图像抓拍
  13. Java开源CMS系统
  14. NPDP产品经理认证考试培训资料--XISAI
  15. 图形化编程Mixly——RFID智能门禁
  16. linux 配额不起作用,Linux 配额
  17. 体验服务器windows系统,怀旧经典:Windows 3.0操作系统体验
  18. 几个国内的 apple 相关社区
  19. 差分信号光电耦合隔离转换PCB焊接式模块
  20. 删除Mac中的Windows启动项

热门文章

  1. java集合根据值排序_Java 8:对集合中的值进行排序
  2. Java中的Volatile如何工作? Java中的volatile关键字示例
  3. ejb 2.0 3.0_定义EJB 3.1视图(本地,远程,无接口)
  4. spring jms 消息_Spring JMS,消息自动转换,JMS模板
  5. java jquery_jQuery数据表和Java集成
  6. 使用TestContainers进行数据库测试
  7. apache camel_Apache Camel入门
  8. 信号量使用例子_用信号量锁定:一个例子
  9. 数据湖 多维数据集_按汇总分组/多维数据集
  10. 配置java ee_Java EE中的配置管理