- 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