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

C 語言結構體指標:操作結構體的高效利器

     編輯:C 語言基礎

指標同樣可以指向結構體,定義形式為:

struct 結構體名 *指標變數名;

結構體指標定義與初始化

struct stu {
    char *name;
    int num;
    int age;
    char group;
    float score;
} stu1 = { "Tom", 12, 18, 'A', 136.5 };

// 定義結構體指標並指向 stu1
struct stu *pstu = &stu1;

// 或在定義結構體時同時定義指標
struct stu { ... } stu1 = { ... }, *pstu = &stu1;

關鍵點:結構體變數名不會像陣列名那樣自動轉換為指標,必須使用 & 取得地址。結構體類型本身不佔記憶體,不可取址。

透過指標存取成員:兩種寫法

  1. (*pointer).memberName —— . 優先級高於 *,括號不可省略。
  2. pointer->memberName —— -> 為箭頭運算子,專門用於結構體指標存取成員,更直觀、常用。

兩者等效,推薦使用 ->。

範例 1:基本結構體指標操作

#include <stdio.h>
int main() {
    struct {
        char *name; int num; int age; char group; float score;
    } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;

    printf("%s的學號是%d,年齡是%d,在%c組,成績是%.1f!\n",
           (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
    printf("%s的學號是%d,年齡是%d,在%c組,成績是%.1f!\n",
           pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
    return 0;
}

範例 2:結構體陣列指標遍歷

#include <stdio.h>
struct stu {
    char *name; int num; int age; char group; float score;
} stus[] = {
    {"Zhou ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"Liu fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
}, *ps;

int main() {
    int len = sizeof(stus) / sizeof(struct stu);
    printf("Name\t\tNum\tAge\tGroup\tScore\n");
    for (ps = stus; ps < stus + len; ps++) {
        printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
    }
    return 0;
}

結構體指標作為函數參數

結構體變數作參數會傳遞整個副本,成員多時開銷大。使用指標僅傳遞地址,效率高:

#include <stdio.h>
struct stu { ... } stus[] = { ... };

void average(struct stu *ps, int len);

int main() {
    int len = sizeof(stus) / sizeof(struct stu);
    average(stus, len);
    return 0;
}

void average(struct stu *ps, int len) {
    int i, num_140 = 0;
    float sum = 0;
    for (i = 0; i < len; i++) {
        sum += (ps + i)->score;
        if ((ps + i)->score < 140) num_140++;
    }
    printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
}

此技巧在大型結構體、頻繁呼叫函數的場景至關重要。

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