
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 向函式傳遞陣列
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 向函式傳遞指標
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近、遠和巨大指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言中的結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中的點(.)運算子
C語言中的點(.)運算子
C語言中的**點(.)運算子**也稱為“**成員選擇運算子**”。它用於選擇結構體和聯合體的成員。**點(.)運算子**是一個二元運算子,需要兩個運算元(結構體或聯合體的名稱和成員名稱),並且它具有最高的運算子優先順序。
當您想要訪問和操作結構體和聯合體的成員(變數)時,**點(.)運算子**非常有用。
使用點(.)運算子
點(.)運算子使用結構體和聯合體變數名來選擇結構體和聯合體的成員。以下是使用點(.)運算子訪問結構體或聯合體成員的語法:
var.member;
這裡,var是某種struct或union型別的變數,而member是在建立結構體或聯合體時定義的元素之一。
示例
使用以下語法,用struct關鍵字定義一個新的派生資料型別:
struct newtype { type elem1; type elem2; type elem3; ... ... };
然後,您可以宣告此派生資料型別的變數,如下所示:
struct newtype var;
要訪問某個成員,
var.elem1;
結構體(struct)中的點運算子
如上所述,點(.)運算子用於訪問和操作結構體的成員。
示例
讓我們宣告一個名為book的struct型別和一個struct變數。以下示例顯示瞭如何使用點運算子(.)訪問book結構體中的成員。
請看下面的例子:
#include <stdio.h> struct book { char title[10]; double price; int pages; }; int main (){ struct book b1 = {"Learn C", 675.50, 325}; printf("Title: %s\n", b1.title); printf("Price: %lf\n", b1.price); printf("No of Pages: %d\n", b1.pages); printf("size of book struct: %d", sizeof(struct book)); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Title: Learn C Price: 675.500000 No of Pages: 325 size of book struct: 32
聯合體中的點運算子
C語言中的union關鍵字也允許您定義派生資料型別,這與struct關鍵字非常相似。但是,與struct變數不同,union型別的變數在任何給定時間只能有一個成員包含值。
點(.)運算子也用於訪問和操作聯合體的成員。
示例
您也可以使用點運算子訪問聯合體成員元素,如本例所示:
#include <stdio.h> union Data { int i; float f; char str[20]; }; int main(){ union Data data; data.i = 10; data.f = 220.5; strcpy( data.str, "C Programming"); printf( "data.i : %d\n", data.i); printf( "data.f : %f\n", data.f); printf( "data.str : %s\n", data.str); return 0; }
輸出
編譯並執行上述程式碼後,將產生以下結果:
data.i : 1917853763 data.f : 4122360580327794860452759994368.000000 data.str : C Programming
巢狀結構體中的點運算子
當struct型別的一個元素本身就是一個或多個型別的複合表示時,就定義了巢狀結構體。
點運算子也可以用於訪問巢狀結構體(以及聯合體型別)的成員。這與普通結構體的訪問方式相同。
假設我們有如下巢狀結構體:
struct struct1 { var1; var2; struct struct2 { var3; var4; } s2; } s1;
在這種情況下,s1的成員如前所述被訪問(作為s1.var1和s1.var2),而內部結構體的成員被訪問為:
s1.s2.var3;
示例
在這個例子中,我們有一個employee資料型別,它的一個元素是出生日期(dob)。我們將在employee結構體中宣告包含三個int型別“d”、“m”和“y”的dob結構體,並且它的變數d1是外部型別的一個元素。
#include <stdio.h> struct employee { char name[10]; float salary; struct dob { int d, m, y; } d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; printf("Name: %s\n", e1.name); printf("Salary: %f\n", e1.salary); printf("Date of Birth: %d-%d-%d\n", e1.d1.d, e1.d1.m, e1.d1.y); return 0; }
輸出
執行程式碼並檢查其輸出:
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990
使用箭頭運算子訪問成員
C語言還有另一種方法可以訪問struct變數的成員。這可以透過指標指向struct變數,使用箭頭運算子(->)來實現。
使用struct關鍵字定義一個新的派生資料型別,語法如下:
struct newtype { type elem1; type elem2; type elem3; ... ... };
然後,您可以宣告此派生資料型別的變數及其指標,如下所示:
struct newtype var; struct newtype *ptr=&var;
要透過指標訪問某個成員,請使用以下語法:
ptr->elem1;
示例
請看下面的例子:
#include <stdio.h> struct book { char title[10]; double price; int pages; }; int main (){ struct book b1 = {"Learn C", 675.50, 325}; struct book *strptr; strptr = &b1; printf("Title: %s\n", strptr->title); printf("Price: %lf\n", strptr->price); printf("No of Pages: %d\n", strptr->pages); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Title: Learn C Price: 675.500000 No of Pages: 325
需要注意的點
需要注意的是:
- 點運算子(.)用於透過struct變數訪問struct元素。
- 要透過其指標訪問元素,我們必須使用間接運算子(->)。
訪問巢狀內部結構體的元素
對於巢狀結構體,
struct struct1 { var1; var2; struct struct2 { var3; var4; } s2; } s1; struct struct1 *ptr=&s1;
要訪問巢狀結構體的內部結構體的元素,我們使用以下語法:
ptr -> s2.var3;
示例
請看下面的例子:
#include <stdio.h> struct employee { char name[10]; float salary; struct dob { int d, m, y; } d1; }; int main(){ struct employee e1 = {"Kiran", 25000, {12, 5, 1990}}; struct employee *ptr = &e1; printf("Name: %s\n", ptr->name); printf("Salary: %f\n", ptr->salary); printf("Date of Birth: %d-%d-%d\n", ptr->d1.d, ptr->d1.m, ptr->d1.y); return 0; }
輸出
執行程式碼並檢查其輸出:
Name: Kiran Salary: 25000.000000 Date of Birth: 12-5-1990