一、結構體
在前面的陣列分享中,把同一型別的資料進行儲存通過陣列,我們可以用陣列來表示這個整體,但是陣列有個特點:內部的每乙個元素都必須是相同型別的資料。那麼如何通過乙個方式將不同型別的資料進行儲存呢?
為此,c語言專門提供了一種構造型別來解決上述問題,這就是結構體,它允許內部的元素是不同型別的。
二、結構體的定義
1.先定義結構體型別, 在定義結構體變數
struct student ;
struct student sd;
2.定義結構體型別的同時定義結構體變數
struct student2sd2;
sd2.age = 16;
sd2.name = 「james」;
sd2.height = 1.9;
3.定義結構體型別的同時定義結構體變數, 並且省略結構體名稱
struct sd3;
sd3.age = 17;
sd3.name = 「james」;
sd3.height = 1.88;
定義結構體型別的同時定義結構體變數, 並且省略結構體名稱的注意:
弊端: 由於結構體型別沒有名稱, 所以以後就不能使用該結構體型別
優點: 如果結構體型別只需要使用一次, 那麼可以使用該方式
三、結構體初始化
1.定義的同時初始化
struct student sd = ;
2.先定義後初始化(一次性初始化)
struct student sd2;
sd2 = (struct student);
3.先定義再初始化(逐個初始化)
struct student sd3;
sd3.name = 「james」;
sd3.age = 18;
sd3.height = 1.87;
4.指定將資料賦值給指定的屬性
struct student sd4 = ;
四、結構體陣列
跟結構體變數一樣,結構體陣列也有3種定義方式:
方式一:
struct student ;
struct student stu[5]; //定義1
方式二:
struct student stu[5]; //定義2
方式三:
struct stu[5]; //定義3
結構體陣列的初始化:
truct stu[2] = , };
五、結構體函式
將結構體變數作為函式引數進行傳遞時,其實傳遞的是全部成員的值,也就是將實參中成員的值一一賦值給對應的形參成員。因此,形參的改變不會影響到實參。相當於拷貝。
// 定義乙個結構體
struct student ;
void test(struct student stu)
int main(int argc, const char * ar**) ;
printf(「修改前的實參:%d 」, stu.age);
// 呼叫test函式
test(stu);
printf(「修改後的實參:%d 」, stu.age);
六、指向結構體的指標
結構體指標變數的定義形式:struct 結構體名稱 指標變數名*
有了指向結構體的指標,那麼就有3種訪問結構體成員的方式
結構體變數名.成員名
(*指標變數名).成員名
指標變數名->成員名
int main(int argc, const char * ar**) ;
// 定義乙個結構體變數
struct student stu = ;
// 定義乙個指向結構體的指標變數
struct student *p;
// 指向結構體變數stu
p = &stu;
//這時候可以用3種方式訪問結構體的成員
// 方式1:結構體變數名.成員名
printf(「name=%s, age = %d 」, stu.name, stu.age);
// 方式2:(*指標變數名).成員名
printf(「name=%s, age = %d 」, (*p).name, (*p).age);
// 方式3:指標變數名->成員名
七、結構體如何開闢儲存空間
看上去, 結構體分配儲存空間是將所有屬性占用的儲存空間的總和加在一起後再分配
注意:其實結構體分配儲存空間本質上並不是將所有屬性占用的儲存空間的總和加在一起後再分配
而是會獲取結構體型別中占用記憶體最大的屬性的大小, 然後取該大小的倍數
特例:如果剩餘的儲存空間」不夠」儲存將要儲存的資料, 那麼就會重新開闢8個位元組的儲存空間, 並且將需要儲存的資料放到新開闢的儲存空間中。
如果剩餘的儲存空間」夠」儲存將要儲存的資料, 那麼就不會開闢了。
八、列舉
列舉就是專門用於表示幾種固定型別的取值,列舉的本質就是基本資料型別, 就是整型。在ios開發中是非常常用的。
列舉型別定義的格式
enum 列舉型別名稱;
注意:由於列舉型別的本質是整型, 所以列舉型別除了可以接收列舉的固定的取值以外, 還可以接收其它整型的值,列舉的值預設從0開始依次遞增。
定義列舉的一般規範:
*(1)列舉型別的取值一般以k開頭 後面跟上列舉型別的名稱 跟上當前取值的含義
(2)和結構體一樣, 列舉型別的名稱首字母大寫*
iOS開發分分鐘搞定C語言 巨集定義和關鍵字
一 巨集定義 概念 巨集定義實質是乙個預編譯指令,在程式未執行之前將某些指令付給相應的變數。一般情況預處理指令都是以 號開頭的,所以巨集定義也是以 開頭,關鍵字為 define 定義巨集定義 undef 結束巨集定義 定義格式及作用域 一般巨集定義都定義在程式的首段 define 巨集名 值。巨集定...
iOS崩潰堆疊符號化,定位問題分分鐘搞定!
最近一段時間,在跟開發者溝通過程中,蘿莉發覺有些開發者對ios的應用符號表還不是很清楚,除了諮詢關於符號表生成 配置的問題以外,對bugly崩潰分析需要配置符號表也存在疑問。在這裡,蘿莉就給大家分享下關於ios符號表的一些內容。首先,進行常識 腦補 注意 和.dsym成對出現,並且二者有相同的uui...
iOS崩潰堆疊符號化,定位問題分分鐘搞定!
最近一段時間,在跟開發者溝通過程中,蘿莉發覺大家對ios的應用符號表還不是很清楚,除了諮詢關於符號表生成 配置的問題以外,對bugly崩潰分析需要配置符號表也存在疑問。在這裡,蘿莉就給大家分享下關於ios符號表的一些內容。首先,進行常識 腦補 1.符號表是什麼?dsym檔案其實是乙個目錄,在子目錄中...