【C语言】C语言的数据类型
1.基本數據類型
大致分為下面三種:
- 整數
- 浮點數
- 字符
| char | 8 | -2^-7 | 2^7-1 |
| unsigned char | 8 | 0 | 2^8-1 |
| short | 16 | -2^15 | 2^15-1 |
| unsigned short | 16 | 0 | 2^16-1 |
| long | 32 | -2^31 | 2^31-1 |
| unsigned long | 32 | 0 | 2^32-1 |
| long long | 64 | -2^63 | 2^63-1 |
| unsigned long long | 64 | 0 | 2^64-1 |
| int | 與機器無關 | ||
| unsigned int | 與機器無關 | ||
| float | 32 | ±2^-126 | ±2^127 |
| double | 64 | ±2^-1023 | ±2^1022 |
2.其他數據類型
這里包括:
- 指針
- 數組
- 字符串
- 結構
2.1 指針
指針是一個變量的地址。
指針呢,是C語言中一個非常核心的概念,這里難以講的明白,大家可以看這位大佬的文章,講的很清楚:
深入理解C語言指針
變量聲明中,變量名前的星號(*)表明了這是一個指針變量,而且類型是該聲明類型。
*運算符間接引用一個指針,返回存儲在指針所包含的內存地址中的值。
&運算符此處名為“地址”,它生成的引用變量的地址。
函數傳參通過傳入指針變量可以實現傳引用而非僅僅是傳值。
一個指向地址0的指針成為空指針,表示該指針并不實際指向有意義的數據。在程序中寫為NULL。
(Java隱藏了指針的概念,但是深入理解C語言的指針對我們深入理解Java大有裨益)
2.2 數組
數組時一組存儲在內存中連續地址的類似變量。元素序號0~length-1。
C語言中數組變量是指向第一個元素(index=0)的指針。
C語言中不能超出數組范圍進行訪問是程序員的責任。C語言沒有邊界檢查,因此一個越界進行訪問的程序可以編譯好,但是運行時會逾越到內存的其他部分。
(Java的數組時被內置好了的,Java畢竟是隱去了指針的概念的,也沒必要讓普通Java程序員直接操縱數組底層。)
(Java存在數組越界檢查,但不是編譯檢查,是拋出運行時異常java.lang.ArrayIndexOutOfBoundsException,但總歸是降低了程序員的負擔。)
聲明數組可以用{}或者定義長度后在代碼中逐位單獨初始化。for循環可以批量分配和讀取數組元素。
數組長度必須是整數常量,從而讓編譯器分配適量的內存空間。
但是當數組作為參數傳遞的時候,不需要定義長度,因為只需要知道數組的初始地址。
通過接收一個數組作為輸入參數,函數實際上可以通過改變數組本身返回多個值。
數組可以是多維的,但是一般至多使用到二維數組。
下面的兩種都是可以接受的:
可見第一個維度可以在傳參的時候不定義。
由于數組由指向初始元素的指針表示,所以C語言不能用=或者==對數組進行運算符復制或者比較數組。必須使用一個循環來復制或者比較數組元素,一次一個。
(Java只不過是對=進行了封裝,而且==所有的元素逐個比較)
2.3 字符串
字符串是用來存儲一塊有界但是可變長度的文本的字符數組。每個字符是一個ASCII碼字節,代表字母、數字、符號。數組大小確定字符串的最大長度,但是字符串的是實際長度可以更短(感覺像一個順序表但不清楚具體的情況)。C語言中通過尋找字符串末尾的空終止符(’\0’,ASCII碼0x00)來確定字符串長度。
定義:
char greetings[10] = "Hello!";不同于基本變量,C語言的字符串不能用=賦值給另一個字符串。
C語言的字符串中的每一個元素必須從源字符串單獨復制到目的字符串。
上面的兩行適用于任何C語言中的數組。
(Java中String類定義了字符串,也是內置的,且終止符也與C語言相同,是’\0’,Java的String由于是內置的,所以功能很強大。)
2.4 結構
C語言中,結構是用于存儲各種類型數據的集合。
結構聲明的一般形式:
struct name {type1 element1;type2 element2;... };struct是一個關鍵字,表明是一個結構。
name是結構標簽名稱。
element1和element2是結構成員,type1和type2是結構成員的類型。
一個結構可以有任意類型的成員。
與內置的C語言數據類型一樣,我們可以創建結構數組和結構指針。
struct contact {char name[30];int phone;//in meters(按米算)float height; };struct contact c1;strcpy(c1.name, "Sam"); c1.phone = 22222; c1.height = 1.80; struct contact classlist[200]; classlist[0].phone = 11111;通常我們使用指向結構的指針。
C語言提供了成員訪問運算符->來間接引用指向結構指針并訪問結構的成員。
可以通過值或者引用將結構作為函數輸入或輸出傳遞。
按值傳遞需要編譯器將整個結構復制到內存中以便函數訪問。
對于大結構,這可能需要大量的內存和時間。
通過引用傳遞包括傳遞一個結構指針,這更有效。
函數還可以修改被指向的結構而不必返回兩一個結構。
注意:
C語言中,typedef語句可以定義自己的數據類型名稱。
typedef可以用于創建新的類型,該類型占據與基本類型相同數量的存儲空間。
typedef unsigned char byte; typedef char bool; #define TRUE 1 #define FALSE 0byte pos = 0x45; bool loveC = TRUE;這樣可讀性更強。
總結
以上是生活随笔為你收集整理的【C语言】C语言的数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Git】Git提交代码到GitHub的
- 下一篇: 【Python】IDLE工具