目錄
1. 啥是結構體
2. 啥是結構體變量
3. 創建結構體變量的小細節
3.1 創建全局結構體變量(不推薦)
3.2 創建局部結構體變量(不推薦)
3.3?創建局部結構體變量Plus
4. 結構體在內存里面咋存?
5. 結構體作為參數進行傳遞
5.1 結構體直接傳參
5.2 結構體的地址傳參
1. 啥是結構體
????????結構體就是數據的集合,可以類比一下數組,數組是相同類型的集合;結構體對數據的異同沒有任何要求;也就是說結構體是不同/相同類型的集合。
2. 啥是結構體變量
? ? ? ? 如果你學過面向對象的語言,可以把結構體變量理解為對象;如果你沒有學過,那么可以把結構體理解為模版,結構體變量理解為根據模版來做的一些具體的東西;例如結構體人類,結構體變量張三,就是根據結構體人類模版來進行“制作”的具體的人。
#include <stdlib.h>
#include<string.h>// 結構體struct Person{char name[20]; };int main()
{struct Person zhangsan = {"zhangsan"}; // 結構體變量張三,是由結構體人類模版“制作”的printf("%s",zhangsan.name);return(0);
}
3. 創建結構體變量的小細節
3.1 創建全局結構體變量(不推薦)
????????我們可以在寫結構體的時候順便把結構體變量定義了,這時候的結構體變量是“全局”的,存在一些問題。
#include <stdlib.h>// 結構體struct Person{char name[20]; }p1,p2; // 全局結構體變量
3.2 創建局部結構體變量(不推薦)
雖然作用域從全局到了局部,但是寫起來還是有點麻煩。
#include <stdlib.h>// 結構體struct Person{char name[20]; };int main()
{struct Person p1,p2;// 局部結構體變量return 0;
}
3.3?創建局部結構體變量Plus
使用typedef 來簡化創建結構體變量的流程。
#include <stdlib.h>// 結構體typedef struct Person{char name[20]; }P;int main()
{P p1,p2;// 局部結構體變量return 0;
}
4. 結構體在內存里面咋存?
????????結構體本身在內存里面并不占用任何空間,當使用結構體創建結構體變量的時候,結構體變量占用內存空間,占用的內存空間跟結構體內的成員變量的大小總和一樣。這很好理解,想象一下你拿著一個重量忽略不計的模具,此時重量為0,一旦使用這個模具制作一些“巧克力”、“冰塊”,此時這些“巧克力、冰塊”就有了重量。
5. 結構體作為參數進行傳遞
5.1 結構體直接傳參
和普通變量傳值一樣,會額外創建一個臨時的結構體變量,如果這個結構體變量占用內存很多,那么臨時結構體變量就會占用那么多空間,不推薦。
#include <stdlib.h>
#include<string.h>
typedef struct Person
{char name[20];
}P;
// 使用結構體直接傳參
void print_1(struct Person p1)// 形參:P p1也是可以的
{printf("%s\n",p1.name);
}int main()
{P z = {"張三"};print_1(z);return(0);
}
5.2 結構體的地址傳參
使用地址傳參,這樣就需要創建一個指針變量,而指針變量的大小是一定的(4或者8個字節),所以不用擔心內存占用的問題。
#include <stdlib.h>
#include<string.h>
typedef struct Person
{char name[20];
}P;// 使用結構體地址傳參
void print_2(struct Person* p1)// 形參:P p1也是可以的
{printf("%s\n",p1->name);
}int main()
{P l = {"李四"};print_2(&l);return(0);
}