C语言结构体使用与指针的理解
以前總有一種疑惑。為什么結構體的指針有的需要用分配空間?有的不需要分配空間呢?現在總結一下思路:
一:關于結構體的定義問題:使用結構體一般會使用變量或者定義指針
typedef?struct{ int?a; int?b; }data;使用這個結構體的兩種方式:
data datas?直接引用。這樣使用類似于int a?這種模式。data類似于一個類型(如:int)這樣的話,在使用的時候,系統自動會為這個類型分配空間。在棧上進行分配,在使用完成后會自動釋放。
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语言结构体使用与指针的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个股周线怎么看?
- 下一篇: C语言结构体描述BMP的文件格式