對應 Java Class,但僅含資料宣告,無方法實作,類似抽象類。
// 1. 先定義再宣告
struct Person { char *name; int age; };
struct Person p1 = {"Zen", 21};
// 2. 定義同時宣告變數
struct Product { char *name; char *desc; } prod, *prodPtr;
// 3. 匿名結構(單例模式)
struct { char *name; int age; } singleton;
p1.age = 22; // 變數用 .
prodPtr->name = "BMW"; // 指標用 -> 等價 (*prodPtr).name
struct News { char title[128]; char *content; };
struct News n;
strcpy(n.title, "標題"); // 陣列需 strcpy
n.content = "內文"; // 指標直接指向字面常數
// 方式一:內嵌匿名結構
struct GoodsBean {
int total;
struct { char *name; char *desc; } goods;
};
// 方式二:引用外部結構
struct ProductBean {
int total;
struct Product product; // 需先定義 Product
};
struct Person persons[] = {{"A",20},{"B",24}};
struct Person *p = persons;
for (int i=0; iname, p->age);
struct Person *arr = malloc(10 * sizeof(struct Person));
arr[0].name = "動態"; arr[0].age = 99;
// 用完務必 free(arr)
struct Dog {
char *name;
void (*bark)(const char *sound);
};
void dog_bark(const char *s) { printf("狗叫:%s\n", s); }
struct Dog d = {"旺財", dog_bark};
d.bark("汪汪"); // 呼叫
typedef char *Name;
typedef struct ImageInfo {
char *name; int size; char *path;
} ImageInfo, *ImageInfoPtr;
void rename(ImageInfoPtr p, const char *newName) {
p->name = newName;
}
注意:typedef 僅為別名,非實例;struct X { ... } x; 才同時建立型別與變數。
struct JNIInvokeInterface {
void *reserved0, *reserved1, *reserved2;
jint (*DestroyJavaVM)(JavaVM*);
jint (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);
// ... 皆為函數指標
};
JNI 大量使用結構體封裝函數指標表,掌握結構體與函數指標是閱讀 JNI 原始碼的關鍵。
結構體是 C 語言資料組織核心,配合指標、動態記憶體、函數指標可實現面向對象雛形。下一章將進入檔案 IO 領域。