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
廣告