C - 資料型別



C 語言中的資料型別指的是一個廣泛的系統,用於宣告不同型別的變數函式。變數的型別決定了它在儲存器中佔用多少空間以及如何解釋儲存的位模式。在本章中,我們將學習C 語言中的資料型別。一個相關的概念是“變數”,它指的是處理器記憶體中可定址的位置。透過不同的輸入裝置捕獲的資料儲存在計算機記憶體中。可以為儲存位置分配一個符號名稱,稱為變數名。

C 是一種靜態型別語言。在實際使用變數之前,必須顯式宣告變數的名稱及其要儲存的資料型別。

C 也是一種強型別語言,這意味著不允許自動或隱式地將一種資料型別轉換為另一種資料型別。

C 語言中的型別可以分類如下:

序號 型別 & 描述
1

基本型別

它們是算術型別,進一步分為:(a) 整數型別和 (b) 浮點型別。

2

列舉型別

它們也是算術型別,用於定義只能在整個程式中分配某些離散整數值的變數。

3

void 型別

型別說明符void表示沒有值可用。

4

派生型別

它們包括 (a) 指標型別,(b) 陣列型別,(c) 結構體型別,(d) 聯合體型別和 (e) 函式型別。

陣列型別和結構體型別統稱為聚合型別。函式的型別指定函式返回值的型別。我們將在下一節中看到基本型別,而其他型別將在後續章節中介紹。

C 語言中的整數資料型別

下表提供了標準整數型別的詳細資訊,包括其儲存大小和值範圍:

型別 儲存大小 值範圍
char 1 位元組 -128 到 127 或 0 到 255
unsigned char 1 位元組 0 到 255
signed char 1 位元組 -128 到 127
int 2 或 4 位元組 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 位元組 0 到 65,535 或 0 到 4,294,967,295
short 2 位元組 -32,768 到 32,767
unsigned short 2 位元組 0 到 65,535
long 8 位元組 -9223372036854775808 到 9223372036854775807
unsigned long 8 位元組 0 到 18446744073709551615

要獲取特定平臺上某個型別或變數的確切大小,可以使用sizeof運算子。表示式sizeof(type)以位元組為單位生成物件或型別的儲存大小。

整數資料型別的示例

下面是一個示例,使用 limits.h 標頭檔案中定義的不同常量來獲取機器上各種型別的尺寸:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("CHAR_BIT    :   %d\n", CHAR_BIT);
   printf("CHAR_MAX    :   %d\n", CHAR_MAX);
   printf("CHAR_MIN    :   %d\n", CHAR_MIN);
   printf("INT_MAX     :   %d\n", INT_MAX);
   printf("INT_MIN     :   %d\n", INT_MIN);
   printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
   printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
   printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
   printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
   printf("SHRT_MAX    :   %d\n", SHRT_MAX);
   printf("SHRT_MIN    :   %d\n", SHRT_MIN);
   printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
   printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
   printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
   printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);

   return 0;
}

輸出

編譯並執行上述程式時,它在 Linux 上會產生以下結果:

CHAR_BIT    :   8
CHAR_MAX    :   127
CHAR_MIN    :   -128
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_MAX    :   9223372036854775807
LONG_MIN    :   -9223372036854775808
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_MAX   :   18446744073709551615
USHRT_MAX   :   65535

C 語言中的浮點資料型別

下表提供了標準浮點型別的詳細資訊,包括儲存大小、值範圍及其精度:

型別 儲存大小 值範圍 精度
float 4 位元組 1.2E-38 到 3.4E+38 6 位小數
double 8 位元組 2.3E-308 到 1.7E+308 15 位小數
long double 10 位元組 3.4E-4932 到 1.1E+4932 19 位小數

"float.h"標頭檔案定義了宏,允許您在程式中使用這些值以及關於實數二進位制表示的其他詳細資訊。

浮點資料型別的示例

以下示例列印 float 型別的儲存空間和範圍值:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("Storage size for float : %zu \n", sizeof(float));
   printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
   printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
   printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
   printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
   printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
   printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
   printf("-DBL_MAX     :  %g\n", (double) -DBL_MAX);
   printf("Precision value: %d\n", FLT_DIG );

   return 0;
}

輸出

編譯並執行上述程式時,它在 Linux 上會產生以下結果:

Storage size for float : 4 
FLT_MAX      :   3.40282e+38
FLT_MIN      :   1.17549e-38
-FLT_MAX     :   -3.40282e+38
-FLT_MIN     :   -1.17549e-38
DBL_MAX      :   1.79769e+308
DBL_MIN      :   2.22507e-308
-DBL_MAX     :  -1.79769e+308
Precision value: 6

注意:"sizeof" 返回 "size_t"。 "size_t" 的無符號整數型別可能會因平臺而異。而且,它可能並非在所有地方都是 long unsigned int。在這種情況下,我們使用 "%zu" 作為格式字串而不是 "%d"。

早期版本的 C 語言沒有布林資料型別。ANSI C 的 C99 標準化引入了 _bool 型別,它將零值視為 false,非零值視為 true。

C 語言中的使用者定義資料型別

有兩種使用者定義的資料型別structunion,可以使用其他基本資料型別的組合來定義。

結構體資料型別

C 語言的獨特特性之一是將不同資料型別的變數儲存在一個變數中。提供了structunion關鍵字來派生使用者定義的資料型別。例如,

struct student   {   
   char name[20];   
   int marks, age;   
};

聯合體資料型別

聯合體是結構體的一種特殊情況,其中聯合體變數的大小不是各個元素大小的總和(如結構體),而是對應於各個元素中最大的大小。因此,一次只能使用其中一個元素。請看以下示例

union ab  {  
   int a;  
   float b;  
};  

我們將在後面的章節中學習更多關於結構體和聯合體型別的知識。

C 語言中的 void 資料型別

void 型別指定沒有值可用。它用於三種情況:

序號 型別 & 描述
1

函式返回 void

C 語言中有各種函式不返回值,或者可以說它們返回void。不返回值的函式的返回型別為void。例如,void exit (int status);

2

函式引數為 void

C 語言中有各種函式不接受任何引數。不帶引數的函式可以接受 void。例如,int rand(void);

3

指向 void 的指標

void *型別的指標表示物件的地址,但不表示其型別。例如,記憶體分配函式 void *malloc( size_t size );返回一個指向 void 的指標,該指標可以轉換為任何資料型別。

C 語言中的陣列資料型別

陣列是儲存在連續記憶體位置中的多個相同資料型別值的集合。陣列的大小在方括號 [] 中指定。例如,

int marks[5];

可以在宣告時初始化陣列。要分配的值放在括號中。

int marks[ ]={50,56,76,67,43};

C 還支援多維陣列。要了解更多關於陣列的資訊,請參閱關於C 語言中的陣列的章節。

C 語言中的指標資料型別

指標是一種特殊的變數,它儲存記憶體中另一個變數/物件的地址或引用。指標變數的名稱以星號 (*) 為字首。指標變數的型別和要指向的變數/物件必須相同。

int x;  
int *y;  
y = &x;

這裡,"y" 是一個指標變數,它儲存 "int" 型別變數 "x" 的地址。

指標用於許多不同的目的。文字字串操作和動態記憶體分配是一些必須使用指標的過程。在本教程的後面,您可以找到關於C 語言中的指標的詳細章節。

廣告