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

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

c/c++培訓C語言核心知識總結(九)

更新時間:2016年10月21日16時47分 來源:傳智播客C++培訓學院 瀏覽次數:

十、結構體
 
1. 結構體的字節對齊:
在C語言里,結構體所占的內存是連續的,但是各個成員之間的地址不一定是連續的。所以就出現了"字節對齊".
 
結構體變量的大小,一定是其最大的數據類型的大小的整數倍,如果某個數據類型大小不夠,就填充字節。
結構體變量的地址,一定和其第一個成員的地址是相同的。
 
1) 結構體字節對齊
#include <stdio.h>
#include <string.h>
 
struct Box
{
// 首先檢查結構體成員里最大的數據類型是 double, 占8個字節,則
int height; // 系統判斷 int 可以和相鄰的 char name[10] 共同填充字節
char name[10]; // char name[10] 需要填充 到double 的倍數,但是可以和相鄰的 int 一起累加,再填充4個字節,對齊 double 的2倍
double width; // double 是所有成員里最大數據類型,滿足double 的1倍
char type; // char 會填充7個字節,對齊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 是結構體成員,但是類型是 struct Student * 類型,用來指向某個 struct Student 的結構體變量的。
// 結構體可以看做是一個自定義的數據類型,而且結構體可以嵌套,但是嵌套有條件:
// 結構體只可以嵌套自身類型的結構體指針,但是絕對不能嵌套自身類型的結構體變量
// 比如,不能嵌套 struct Student next; 這種
};
 
int main(void)
{
struct Student stu, *stup; // 定義了一個結構體變量 stu 和 一個結構體指針變量 stup
 
stu.name = (char *)malloc(10 * sizeof(char)); // 給姓名申請了一個10個字節的堆空間
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 指向了 結構體變量 stup 的首地址,鏈表誕生
stup->next = NULL; // stup的成員 next 指向 NULL, 保證安全。
 
free(stup->name); // 最后申請的堆 最先釋放
free(stup); // 繼續釋放
free(stu.name); // 最先申請的堆 最后釋放
 
return 0; // 程序正常結束
}
 
 
 
End...
 
 
 本文版權歸傳智播客C++培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客C/C++培訓學院
首發:http://www.itcast.cn/c/ 
0 分享到:
红豆直播app黄台_红豆直播app下载免费_红豆直播app下载