首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言結構體與指標深度解析:從基礎到 JNI 實戰

     編輯:關於C

結構體:C 語言的「類」

對應 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;

成員存取:點號 vs 箭號

p1.age = 22;           // 變數用 .
prodPtr->name = "BMW"; // 指標用 ->  等價 (*prodPtr).name

字元陣列 vs 字元指標賦值差異

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 簡化類型名稱

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; 才同時建立型別與變數。

JNI 實戰:jni.h 中的結構體

struct JNIInvokeInterface {
    void *reserved0, *reserved1, *reserved2;
    jint (*DestroyJavaVM)(JavaVM*);
    jint (*AttachCurrentThread)(JavaVM*, JNIEnv**, void*);
    // ... 皆為函數指標
};

JNI 大量使用結構體封裝函數指標表,掌握結構體與函數指標是閱讀 JNI 原始碼的關鍵。

總結

結構體是 C 語言資料組織核心,配合指標、動態記憶體、函數指標可實現面向對象雛形。下一章將進入檔案 IO 領域。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved