[源碼下載]
作者:webabcd
介紹
不可或缺 Windows Native 之 C 語言
示例
cStruct.h
#ifndef _MYHEAD_STRUCT_ #define _MYHEAD_STRUCT_ #ifdef __cplusplus extern "C" #endif char *demo_cStruct(); #endif
cStruct.c
/*
* 結構體,共用體,枚舉,類型定義符
*
* 注:結構體變量在做參數傳遞時,其內每個成員都會被傳遞,會降低效率。所以一般通過結構體指針傳遞
*/
#include "pch.h"
#include "cStruct.h"
#include "cHelper.h"
void struct_demo1();
void struct_demo2();
void struct_demo3();
void struct_demo4();
void union_demo();
void enum_demo1();
void typedef_demo1();
// 定義一個名為 birth 的結構體類型
/*
* struct 結構名
* {
* 成員表列
* };
*/
struct birth
{
int year; // 結構體成員
int month; // 結構體成員
int day; // 結構體成員
};
char *demo_cStruct()
{
// 結構體基礎 1
struct_demo1();
// 結構體基礎 2
struct_demo2();
// 結構體指針(指向結構體變量的指針)
struct_demo3();
// 結構體數組
struct_demo4();
// 共用體(聯合體)
union_demo();
// 枚舉
enum_demo1();
// 類型定義符
typedef_demo1();
return "看代碼及注釋吧";
}
// 結構體基礎 1
void struct_demo1()
{
// 定義一個名為 employee 的結構體類型
struct employee
{
int num; // 結構體成員
char *name = "unknown"; // 結構體成員,可以為其設置默認值
float sarlary; // 結構體成員
struct birth birthday; // 結構體成員,可以是另一個結構體
};
// 聲明一個 employee 類型的結構體
struct employee employee1;
// 為結構體賦值(訪問結構體成員通過“.”來實現)
employee1.num = 100;
employee1.name = "webabcd";
employee1.sarlary = 100.5f;
employee1.birthday.year = 1980;
employee1.birthday.month = 2;
employee1.birthday.day = 14;
// 占用內存空間為 24 字節
int size = sizeof(struct employee);
}
// 結構體基礎 2
void struct_demo2()
{
// 常用的結構體類型可以用宏定義來表示(也可以用 typedef, 後面再說)
#define EMPLOYEE struct employee
EMPLOYEE
{
int num;
char *name;
} employee1, employee2 = { 100, "webabcd" }; // 聲明結構體變量的時候就可以對其初始化
EMPLOYEE employee3 = { 100, "webabcd" };
// 在定義結構體類型的時候,就聲明變量的話,可以省去結構體名
struct
{
int num;
char *name;
} employee4, employee5 = { 100, "webabcd" }; // 聲明結構體變量的時候就可以對其初始化
// 相同類型的結構體是可以互相賦值的,其成員無論是基本類型還是指針都會復制出一份新的
employee1 = employee2;
employee2.num = 99;
employee2.name = "wanglei";
// 結果:employee1(num=100, name="webabcd"), employee2(num=99, name="wanglei")
}
// 結構體指針(指向結構體變量的指針)
void struct_demo3()
{
struct employee
{
int num;
char *name;
};
struct employee employee1 = { 100, "webabcd" };
// 定義一個結構體指針(指向結構體變量的指針)
struct employee *employee = &employee1;
char *name = employee1.name;
// (*employee) - 是結構體指針所指向的結構體內容
name = (*employee).name;
// 如果通過結構體指針訪問結構體指針所指向的結構體的成員的話,通過“->”來實現
name = employee->name;
}
// 結構體數組
void struct_demo4()
{
struct employee
{
int num;
char *name;
};
// 定義一個結構體數組
struct employee employees[2] =
{
{ 100, "webabcd" },
{ 200, "wanglei" }
};
// 結構體數組和指針的關系,與一般數組和指針的關系是一樣的
struct employee *employee1 = employees;
struct employee *employee2 = &employees[0];
}
// 共用體(聯合體)
void union_demo()
{
// 所謂共用體,就是讓幾個變量共用一個內存空間,共用體占用空間大小為該共用體最大基本類型成員的整倍數,且大小要正好包含住共用體最大類型成員
// 注:以下如果有列出結果的,均為我的環境的結果。比如我這裡 int 是占用 4 個字節的
union u // 占用 4 個字節(a 占用 4 個字節,b 占用 4 個字節,由於他們共用一個內存空間,所以這個共用體占用 4 個字節)
{
int a;
int b;
} u1;
u1.a = 1;
u1.b++;
// 上面執行後的結果是 u1.a 等於 2,u1.b 等於 2,因為他們是共用一個內存空間
union // 占用 12 個字節(a 占用 4 個字節,b 占用 10 個字節,該共用體最大基本類型為 int,它占 4 個字節,以它來對齊,則這個共用體占用 12 個字節)
{
int a; // 共用體最大基本類型成員
char s[10]; // 共用體最大類型成員
} u2;
u2.a = 0x61626364; // abcd
char s1 = u2.s[0]; // d
char s2 = u2.s[0]; // c
char s3 = u2.s[0]; // b
char s4 = u2.s[0]; // a
// 由上可見,我的 cpu 是小端模式,即高地址存高字節,低地址存低字節
// 注:網絡字節順序是按大端模式,即高位數據存放在低位地址(可以通過 ntohs, ntohl, htons, htonl 做轉換)
}
// 枚舉
void enum_demo1()
{
/*
* enum 枚舉名
* {
* 枚舉值表
* };
*/
// 定義一個名為 weekday 的枚舉類型
enum weekday
{
sun, mon, tue, wed, thu, fri, sat
} a, b, c = fri; // 聲明並初始化枚舉變量
// 聲明一個 weekday 類型的枚舉變量,並初始化
weekday d = sat; // 枚舉值不是字符串呦
// 判斷一個枚舉值的話,可以用枚舉值或枚舉值索引
if (d == sat && d == 6)
{
// 用枚舉值索引復制枚舉值時,需要強制類型轉換
weekday e = (enum weekday)3; // wed
}
// 在定義枚舉類型的時候,就聲明變量的話,可以省去枚舉名
enum
{
v1, v2, v3
} e1, e2, e3 = v3;
}
// 類型定義符
void typedef_demo1()
{
// typedef - 類型定義符
// INTEGER 類型就是 int 類型
typedef int INTEGER;
INTEGER a, b;
// INTP 類型就是指向 int 類型的指針
typedef int* INTP;
// NAME 類型就是長度為 20 的 char 數組
typedef char NAME[20];
NAME a1, a2;
// STR 類型就是 char 指針
typedef char *STR;
STR s1, s2;
// EMP 類型就是 struct employee 結構體
typedef struct employee
{
int num;
char *name;
} EMP;
EMP emp1 = { 100, "webabcd" };
// 注:宏定義是字符串替換,typedef 是類型替換;宏定義是由預處理完成的,typedef 則是在編譯時完成的
}
OK
[源碼下載]