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

C 語言結構體指標完整指南:指標操作、函式參數傳遞與實戰範例

     編輯:關於C語言

結構體指標基礎

指標可指向結構體起始位址,宣告語法:struct student *p;。透過指標存取成員有兩種寫法:

  • (*p).score:先解參考再存取
  • p->score:箭頭運算子,更常用、可讀性更高

完整程式範例

#include <stdio.h>

struct student {
    int num;
    char name[20];
    char sex;
    int age;
    float score;
};

struct student stu[3] = {
    {11302, "Wang", 'F', 20, 486.69},
    {11303, "Zhao", 'F', 25, 466.59},
    {11304, "Xue", 'M', 26, 483.59}
};

int main() {
    struct student student1 = {11305, "Li", 'F', 19, 59.59};
    struct student *p, *q;
    int i;

    p = &student1;  // 指向單一結構體
    printf("%s,%c,%f\n", student1.name, (*p).sex, p->score);

    q = stu;  // 指向陣列首元素
    for (i = 0; i < 3; i++, q++) {
        printf("%s,%c,%f\n", q->name, (*q).sex, stu[i].score);
    }
    return 0;
}

指標運算子優先序細節

運算式含義
p->num++先取值再遞增(後綴++)
++p->num先遞增再取值(前綴++)
(p++)->num先用 p 存取,再 p 遞增指向下一個
(++p)->num先 p 遞增指向下一個,再存取

結構體與結構體指標作為函式參數

傳值呼叫(結構體變數)

void print(struct student s) {  // 複製整個結構體
    printf("%s,%d,%f\n", s.name, s.age, s.score);
}
// 呼叫:print(stu[i]);

傳址呼叫(結構體指標)

void add(struct student *q) {  // 傳遞位址,可修改原資料
    if (q->age <= 19) q->score += 10;
}
// 呼叫:add(p);  或  add(&stu[i]);

完整對比範例

int main() {
    struct student *p;
    int i;

    // 傳值:print 接收副本,不影響原資料
    for (i = 0; i < 3; i++) print(stu[i]);

    // 傳址:add 接收指標,可修改原資料
    for (i = 0, p = stu; i < 3; i++, p++) add(p);

    // 再次列印驗證修改結果
    printf("\n");
    for (i = 0, p = stu; i < 3; i++, p++) print(*p);  // *p 相當於 stu[i]
    return 0;
}

關鍵差異總結

  • 傳值:函式內操作副本,原資料不變;大型結構體複製成本高
  • 傳址:函式內操作原資料;效率高、可修改內容;需注意 const 保護
  • 若函式需回傳結構體,回傳型別應為 struct student,並 return *q;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved