教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

c/c++培訓(xùn)C語言核心知識總結(jié)(十)

更新時間:2016年10月21日16時49分 來源:傳智播客C++培訓(xùn)學(xué)院 瀏覽次數(shù):

十、結(jié)構(gòu)體
 
1. 結(jié)構(gòu)體的字節(jié)對齊:
在C語言里,結(jié)構(gòu)體所占的內(nèi)存是連續(xù)的,但是各個成員之間的地址不一定是連續(xù)的。所以就出現(xiàn)了"字節(jié)對齊".
 
結(jié)構(gòu)體變量的大小,一定是其最大的數(shù)據(jù)類型的大小的整數(shù)倍,如果某個數(shù)據(jù)類型大小不夠,就填充字節(jié)。
結(jié)構(gòu)體變量的地址,一定和其第一個成員的地址是相同的。
 
1) 結(jié)構(gòu)體字節(jié)對齊
#include <stdio.h>
#include <string.h>
 
struct Box
{
// 首先檢查結(jié)構(gòu)體成員里最大的數(shù)據(jù)類型是 double, 占8個字節(jié),則
int height; // 系統(tǒng)判斷 int 可以和相鄰的 char name[10] 共同填充字節(jié)
char name[10]; // char name[10] 需要填充 到double 的倍數(shù),但是可以和相鄰的 int 一起累加,再填充4個字節(jié),對齊 double 的2倍
double width; // double 是所有成員里最大數(shù)據(jù)類型,滿足double 的1倍
char type; // char 會填充7個字節(jié),對齊double 的1倍
};
 
int main(void)
{
struct Box box;
box.height = 4; // 高度
strcpy(box.name, "Dropbox"); // 名稱
box.width = 5.5; // 寬度
box.type = 'C'; // 類型
 
printf("box = %p\n", &box);
printf("box.height = %p\n", &box.height);
printf("box.name = %p\n", box.name);
printf("box.width = %p\n", &box.width);
printf("box.type = %p\n", &box.type);
 
printf("box = %d\n", sizeof(box)); // 16 + 8 + 8 = 24
return 0;
}
 
 
 
2) 初識鏈表
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
struct Student
{
char *name; // 姓名
int age; // 年齡
struct Student *next;
// next 是結(jié)構(gòu)體成員,但是類型是 struct Student * 類型,用來指向某個 struct Student 的結(jié)構(gòu)體變量的。
// 結(jié)構(gòu)體可以看做是一個自定義的數(shù)據(jù)類型,而且結(jié)構(gòu)體可以嵌套,但是嵌套有條件:
// 結(jié)構(gòu)體只可以嵌套自身類型的結(jié)構(gòu)體指針,但是絕對不能嵌套自身類型的結(jié)構(gòu)體變量
// 比如,不能嵌套 struct Student next; 這種
};
 
int main(void)
{
struct Student stu, *stup; // 定義了一個結(jié)構(gòu)體變量 stu 和 一個結(jié)構(gòu)體指針變量 stup
 
stu.name = (char *)malloc(10 * sizeof(char)); // 給姓名申請了一個10個字節(jié)的堆空間
strcpy(stu.name, "damao"); // 拷貝字符串 "damao" 給 stu.name (注意,不能直接賦值,要用拷貝)
stu.age = 18; // 今年 18歲了
 
 
stup = (struct Student *)malloc(1 * sizeof(struct Student)); // 給 stup 申請一個堆空間,用來保存兩個指針(name,next)和一個int
stup->name = (char *)malloc(10 * sizeof(char)); // 給 stup->name 申請一個堆空間,保存字符串
strcpy(stup->name, "ermao"); // 拷貝字符串
stup->age = 16; // 今年 16歲了
 
stu.next = stup; // stu的成員next 指向了 結(jié)構(gòu)體變量 stup 的首地址,鏈表誕生
stup->next = NULL; // stup的成員 next 指向 NULL, 保證安全。
 
free(stup->name); // 最后申請的堆 最先釋放
free(stup); // 繼續(xù)釋放
free(stu.name); // 最先申請的堆 最后釋放
 
return 0; // 程序正常結(jié)束
}
 
 
 
End...
 
 本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/c/ 
 
0 分享到:
和我們在線交談!