Kiểu dữ liệu trong C

Trong C có 5 kiểu dữ liệu cơ bản: intfloatdoublecharvoid. Ngoài ra khi kết hợp với các từ khóa signedunsignedlongshort ta còn có thêm các kiểu dẫn xuất. Kiểu cấu trúc struct trong C cho phép ta định nghĩa các kiểu dữ liệu mới dựa trên các kiểu dữ liệu cơ bản. Kiểu con trỏ là kiểu dữ liệu đặc biệt dùng lưu địa chỉ của biến khác.

Kiểu số nguyên
Kiểu số nguyên trong C là int, được dùng để lưu trữ số nguyên. Đây là kiểu dữ liệu cơ bản nhất trong các ngôn ngữ lập trình. Giá trị của kiểu int không cố định mà phụ thuộc vào trình biên dịch, thông thường là 4 bytes.

Ví dụ:
1
2
3
int a;
int a = 5;
int a, b;

Kiểu số thực
Trong C có 2 kiểu số thực là float và double, cho phép lưu trữ cả phần thập phân của một số.
Kiểu float có giá trị 4 bytes và có độ chính xác tới 6 chữ số thập phân. Kiểu double có giá trị 8 bytes và chính xác tới 10 chữ số. Tuy nhiên độ chính xác này là tương đối và còn phụ thuộc vào hệ điều hành.

Tùy nhu cầu mà người ta sử dụng float hay double, nếu tính toán không yêu cầu độ chính xác cao nên dùng kiểu float để tiết kiệm bộ nhớ.
Lưu ý: tính toán với các kiểu dữ liệu thực luôn có sai số.

Ví dụ:
1
2
float a = 5.7;
double b = 6; //=> 6.0


Kiểu ký tự
Kiểu char dùng để lưu trữ 1 ký tự.
Người ta dùng dấu nháy đơn cho ký tự và dấu nháy kép cho chuỗi.
Ví dụ: Ký tự: 'a''@''~' - Chuỗi: "a""abc"

Chuỗi ký tự thực chất là một mảng ký tự char được kết thúc bằng ký tự NULL (tức ký tự'\0').
Ký tự trong C thực chất là các số nguyên biểu diễn mã ASCII của ký tự. Bảng mã ASCII đầy đủ có 255 ký tự, vì vậy người ta dùng 8 bit để biểu diễn chúng nên kiểu char có giá trị 1 byte.

Ví dụ:
1
2
char name = 'a';
char[13] = "Hello World\n";

Kiểu void
Đây là một kiểu đặc biệt để báo hiệu cho trình biên dịch biết rằng không có dữ liệu của bất cứ kiểu nào. Các hàm thường phải trả về một kiểu nào đó nhưng khi không muốn trả về bất cứ gì, ta có thể dùng kiểu trả về là void.
Biến không có kiểu void nhưng biến con trỏ có thể được khai báo kiểu void.


Các kiểu dẫn xuất
Các kiểu dữ liệu cơ bản (trừ kiểu void) có thể được điều chỉnh cho phù hợp ý muốn người lập trình. Ta có thể thêm các từ khóa: signedunsignedlongshort vào trước các kiểu nguyên và kiểu ký tự để có được kiểu dẫn xuất.

Khi khai báo một biến kiểu int, mặc định đó là số nguyên có dấu. Người ta thêm từ khóa unsigned vào trước int để quy định biến này lưu trữ số nguyên không dấu, nghĩa là chỉ có thể lưu trữ giá trị dương.
Với kiểu char, mặc định là không dấu nên có thể dùng từ khóa signed nếu muốn lưu trữ số có dấu.
Các từ khóa signed và unsigned không làm thay đổi không gian cấp phát cho biến.
Ví dụ:
1
unsigned int a = 6550;
Từ khóa short được dùng với kiểu int khi muốn giảm không gian cấp phát. Một biếnshort (hay short int) sẽ có giá trị 2 bytes.
Từ khóa long có thể được dùng với int hoặc double. Nó làm tăng không gian bộ nhớ lên gấp đôi để lưu trữ được những số lớn hơn. Đặc biệt với những trường hợp số quá lớn có thể dùng long long int.
Ví dụ:
1
2
short a = 5;
long long int b = 6789;


Kiểu cấu trúc struct
Trong C bạn có thể kết hợp các kiểu cơ bản tạo thành kiểu dữ liệu mới nhằm giải quyết vấn đề một cách đơn giản hơn.
Ví dụ: Bạn có thể khai báo cấu trúc phân số gồm 2 thành phần tử và mẫu để tiện cho việc tính toán với phân số.
Khai báo:
Ta có thể khai báo như sau:
1
2
3
4
5
struct PS
{
   int tuSo;
   int mauSo;
}PS;
Nếu khai báo như thế này mỗi lần khai báo biến kiểu phân số bạn phải thêm từ khóastruct đằng trước.
1
struct PS a;
Để tiện hơn ta có thể dùng từ khóa typedef để định nghĩa lại kiểu này.
1
typedef struct PS PhanSo;
Và sau đó khi khai báo biến chỉ cần dùng:
1
PhanSo a;
Ta có thể kết hợp lại cho đỡ rườm rà
1
2
3
4
5
typedef struct PS
{
   int tuSo;
   int mauSo;
}PhanSo;

Để gọi các thành phần trong biến cấu trúc có thể dùng toán tử .
Nếu là con trỏ đến biến cấu trúc dùng toán tử ->
Ví dụ:
1
2
3
4
5
6
7
PhanSo ps1;
ps1.tuSo = 1;
ps1.mauSo = 2;
 
PhanSo *ps2 = &ps1;
ps2->tuSo = 3;
ps2->mauSo = 4;

Kiểu con trỏ
Đây là kiểu dữ liệu đặc biệt trong C. Kiểu con trỏ dùng để lưu địa chỉ của biến khác chứ không phải lưu số hay chữ. Kiểu con trỏ thường dùng để cấp phát động hoặc gián tiếp thay đổi giá trị của một biến.

Nhận xét