C là một ngôn ngữ lập trình rất mạnh mẽ, được sử dụng để phát triển hệ điều hành, cơ sở dữ liệu và nhiều hơn thế nữa. Đây là một ngôn ngữ tuyệt vời cho những người quan tâm đến ngành công nghệ thông tin. Để làm việc với ngôn ngữ lập trình C, bạn cần hiểu rõ về các kiểu dữ liệu C. Khi muốn xác định một biến trong chương trình C, chúng ta cần chỉ định kiểu dữ liệu. Điều này giúp trình biên dịch biết loại dữ liệu mà muốn thực hiện và những thao tác có thể được thực hiện trên nó. Hãy cùng FPT Aptech đi sâu tìm hiểu kỹ hơn về kiểu dữ liệu trong C ngay sau đây.
Các kiểu dữ liệu trong C là gì?
Kiểu dữ liệu (data type) có thể hiểu đơn giản là những kiểu dữ liệu được lưu trữ sẵn trong chương trình C. Chúng thường được sử dụng khi xác định biến hoặc các hàm trong C. Điều quan trọng là trình biên dịch phải hiểu loại dữ liệu được xác định trước để biết cách diễn giải giá trị.
Các kiểu dữ liệu trong C là kiến thức cơ bản mà “dân” lập trình cần biết
Ví dụ, nếu biến là một vùng chứa thì kiểu dữ liệu sẽ là kiểu vùng chứa, nó sẽ thông báo cho bạn vật dụng mà nó nên chứa đựng. Tức là bạn sẽ không lưu trữ một giá trị là số nguyên trong một biến kiểu dữ liệu String, cũng giống như bạn sẽ không bỏ một vật hình tròn vào ô vuông được.
Mỗi biến trong C có một kiểu dữ liệu liên quan. Mỗi kiểu dữ liệu trong C bắt buộc phải có số lượng bộ nhớ nhất định và có các hoạt động cụ thể có thể thực hiện trên biến C. Kiểu dữ liệu trong C cũng sẽ chỉ định kiểu dữ liệu mà biến có thể lưu trữ như kiểu số nguyên (integer, char), kiểu số thực (float & double),... Kiểu dữ liệu là tập hợp dữ liệu với các giá trị có giá trị cố định, ý nghĩa cũng như đặc điểm của nó.
Ví dụ về data type in C
Hãy xem xét một ví dụ về kiểu dữ liệu cơ bản trong C tại một công ty. Nơi đây sẽ lưu trữ nhiều dữ liệu khác nhau của nhân viên như Tên, ID nhân viên, Tuổi, Mức lương, Địa chỉ, Số điện thoại, v.v.
Những dữ liệu này là các giá trị chứa bảng chữ cái, số..., vì vậy, để giúp việc xử lý những dữ liệu khổng lồ này trở nên dễ hiểu, thông tin đã được phân loại thành các loại khác nhau như:
- Tên: String
- ID: Số nguyên - Integer
- Mức lương: Float or Double
- Số điện thoại: String
Để hiểu được ví dụ này, hãy cùng tìm hiểu các kiểu dữ liệu trong C ngay sau đây.
Kích thước các kiểu dữ liệu trong C (Basic Types in C)
Các kiểu dữ liệu cơ bản dựa trên số nguyên và dựa trên thập phân. Ngôn ngữ C hỗ trợ cả ký tự có dấu và không dấu. Kích thước bộ nhớ của các kiểu dữ liệu cơ bản có thể thay đổi theo hệ điều hành 32 hoặc 64-bit.
Có 4 kiểu dữ liệu cơ bản trong C là Int, Float, Double, Char. Kích thước lưu trữ của các kiểu dữ liệu này thường có thể thay đổi tùy thuộc vào hệ điều hành của chương trình (là 32-bit hoặc 64-bit). Dưới đây là các kiểu dữ liệu thường được sử dụng trong lập trình C với kích thước lưu trữ và phạm vi giá trị của chúng, theo kiến trúc 32-bit.
Kiểu | Kích thước lưu trữ | Vùng giá trị |
---|---|---|
Int (hoặc signed int) | 2 byte | -32,768 đến 32,767 |
unsigned int | 2 byte | 0 đến 65,535 |
Short int | 2 byte | -32,768 đến 32,767 |
Long (hoặc signed int) | 4 byte | -2,147,483,648 đến 2,147,483,647 |
unsigned long | 4 byte | 0 đến 4,294,967,295 |
Float | 4 byte | 1.2E-38 đến 3.4E+38 (6 chữ số thập phân) |
Double | 8 byte | 2.3E-308 đến 1.7E+308 (15 chữ số thập phân) |
Long double | 10 byte | 3.4E-4932 đến 1.1E+4932 (19 chữ số thập phân) |
Char (hoặc signed char) | 1 byte | -128 đến 127 |
unsigned char | 1 byte | 0 đến 255 |
Các kiểu dữ liệu trong C mà bạn cần biết
Về cơ bản, trong ngôn ngữ C, tồn tại bốn kiểu dữ liệu khác nhau có thể được sử dụng để phân biệt và lưu trữ nhiều kiểu dữ liệu khác nhau, bao gồm:
- Các kiểu dữ liệu cơ bản (Basic Types) là các kiểu số học và được phân loại thành kiểu số nguyên (int, char) và kiểu thập phân hoặc có thể gọi là dấu phẩy động (float & double).
- Các kiểu dữ liệu có nguồn gốc (Derived types) gồm Con trỏ (pointer), Kiểu mảng (array), Kiểu cấu trúc (structure), Kiểu union, Kiểu hàm (function).
- Kiểu dữ liệu liệt kê (Enumerated types): Cũng là kiểu số học và chúng được sử dụng để định nghĩa các biến chỉ có thể gán các giá trị nguyên rời rạc nhất định trong toàn bộ chương trình.
- Kiểu dữ liệu trống (The type void): Void xác định kiểu chỉ ra rằng không có giá trị nào.
Kiểu dữ liệu cơ bản - Basic Type
Kiểu dữ liệu số nguyên - Int
Một biến kiểu số nguyên có thể lưu trữ các giá trị 0, dương và âm mà không có bất kỳ số thập phân nào. Kiểu dữ liệu số nguyên trong C được hiển thị bằng từ khóa 'int' và có thể có dấu hoặc không dấu. Theo mặc định, giá trị được gán cho một biến số nguyên được coi là dương nếu nó không có dấu.
Kiểu dữ liệu số nguyên được chia thành các kiểu dữ liệu short, int và long. Kiểu dữ liệu ngắn (short) chiếm 2 byte không gian lưu trữ. Int thường chiếm 2 hoặc 4 byte, và long chiếm 8 byte trong hệ điều hành 64 bit và 4 byte trong hệ điều hành 32 bit.
Vì vậy, nếu bạn cố gắng gán giá trị thập phân cho biến số nguyên, giá trị sau số thập phân sẽ bị cắt bớt và chỉ giữ lại số nguyên. Dưới đây là một ví dụ:
Ví dụ về kiểu dữ liệu số nguyên bạn có thể tham khảo
Trong quá trình thực hiện phép toán, nếu kết quả trả về là giá trị thập phân, biến sẽ chỉ chấp nhận số nguyên và loại bỏ các số sau dấu thập phân. Đối với int ngắn, giá trị không chính xác sẽ được hiển thị nếu số lớn hơn 10000.
Kiểu dữ liệu dấu phẩy động - Float
Kiểu dữ liệu dấu phẩy động cho phép lưu trữ các giá trị thập phân trong một biến. Có hai loại kiểu dữ liệu dấu phẩy động: Float và Double.
Biến float lưu trữ các giá trị thập phân với tối đa 6 chữ số sau dấu thập phân. Kích thước lưu trữ của biến float là 4 byte, nhưng kích thước có thể khác nhau đối với các bộ xử lý khác nhau, giống như kiểu dữ liệu 'int'. Ví dụ:
#include
int main() {
float sum = 9664.35;
float num = 67;
float average = (sum / num);
printf("Trung bình là %f\n", average);
printf("Giá trị của num là %f\n", num);
printf("Giá trị của num được trình bày dưới dạng số nguyên %d\n", num);
}
Kết quả sẽ cho ra giá trị trung bình là 144.244019; Giá trị của num là 67.000000; Giá trị của num được trình bày dưới dạng số nguyên 0.
Nếu bạn cố gắng in các giá trị float với '%d', thì kết quả đầu ra sẽ không phải là 67. Thay vào đó, bạn sẽ thấy một giá trị rác trên màn hình đầu ra. Do đó, đối với kiểu dữ liệu trong C, các giá trị float được hiển thị bằng mã định dạng '%f'. Một biến chứa giá trị số nguyên cũng sẽ được in theo kiểu động với các số 0 dư thừa. Nếu bạn gán một giá trị nguyên cho một biến float, kết quả sẽ luôn là một giá trị float với các số 0 sau vị trí thập phân.
Kiểu dữ liệu double tương tự như float, nhưng ở đây, bạn có thể có tối đa 10 chữ số sau vị trí thập phân. Nó được đại diện bởi từ khóa 'double' và chủ yếu được sử dụng trong các chương trình khoa học đòi hỏi độ chính xác cao.
Kiểu dữ liệu ký tự - Char
Kiểu dữ liệu char được sử dụng để lưu trữ các giá trị ký tự đơn, bao gồm cả giá trị số. Nếu bạn tạo một mảng kiểu dữ liệu ký tự, nó sẽ trở thành một chuỗi có thể lưu trữ các giá trị như tên, chủ đề, v.v.
Hiểu được các kiểu dữ liệu trong C không phải là điều đơn giản
Các kiểu dữ liệu có nguồn gốc
Các kiểu dữ liệu nguyên thủy (primitive data type) hoặc cơ bản được sử dụng để lưu trữ các giá trị đơn lẻ của các dạng khác nhau. Tuy nhiên, nếu bạn cần lưu trữ thêm các giá trị của cùng một kiểu dữ liệu, các kiểu dữ liệu có nguồn gốc cho phép bạn kết hợp các kiểu dữ liệu cơ bản và lưu trữ nhiều giá trị trong một biến duy nhất.
Các kiểu dữ liệu trong C có nguồn gốc do chính người dùng xác định, có nghĩa là bạn có thể tổng hợp nhiều phần tử của các kiểu dữ liệu tương tự theo yêu cầu. Có bốn loại kiểu dữ liệu có nguồn gốc: Con trỏ (pointer), Mảng (array), Cấu trúc (structure), Union.
Mảng (array) là một tập hợp các phần tử kiểu dữ liệu tương tự được lưu trữ trong một vị trí bộ nhớ liền kề. Ví dụ: bạn có thể lưu trữ các giá trị float như dấu của sinh viên, giá trị số nguyên như số cuộn, v.v.
Con trỏ (pointer) là một biến dùng để lưu địa chỉ của một biến khác. Để lưu trữ địa chỉ của một biến, biến con trỏ phải có cùng kiểu dữ liệu. Con trỏ cho phép người dùng thực hiện cấp phát bộ nhớ động bằng ngôn ngữ C và cũng truyền các biến bằng cách tham chiếu, có nghĩa là người dùng có thể chuyển con trỏ có địa chỉ của biến.
Trong ngôn ngữ C, cấu trúc là một kiểu dữ liệu do người dùng định nghĩa, là một nhóm các mục được sử dụng để lưu trữ các giá trị của các kiểu dữ liệu giống nhau hoặc khác nhau. Ví dụ, các cấu trúc có thể được sử dụng để lưu trữ thông tin về một học sinh, bao gồm tên, số cuộn, điểm, v.v. Bản ghi của mỗi sinh viên sẽ được đại diện bởi một đối tượng của cấu trúc.
Union cũng là một tập hợp các phần tử có kiểu dữ liệu giống nhau hoặc khác nhau, nhưng vị trí bộ nhớ của tất cả các phần tử là như nhau. Nó là một kiểu dữ liệu đặc biệt trong ngôn ngữ C, nơi bạn có thể khai báo nhiều biến, nhưng chỉ một biến có thể lưu giá trị tại một thời điểm nhất định. Union được hiển thị bằng từ khóa 'union'.
Kiểu dữ liệu liệt kê
Liệt kê là một kiểu dữ liệu do người dùng định nghĩa được sử dụng để gán tên cho các hằng số tích phân và nâng cao khả năng đọc của chương trình C. Từ khóa được sử dụng để liệt kê là 'enum' với cú pháp tương tự như cấu trúc: enum flag {const1, const2, const3, ...}.
Có hai lý do chính tại sao liệt kê tốt hơn '#define': là hằng số enum nhận giá trị mặc định bởi trình biên dịch và chúng có thể được khai báo trong phạm vi cục bộ.
Kiểu dữ liệu trống (The type void)
Void là một kiểu dữ liệu trong C không tham chiếu đến bất kỳ giá trị nào của bất kỳ kiểu nào. Nó chủ yếu được sử dụng làm kiểu trả về trong các hàm. Bạn có thể khai báo các con trỏ void để lấy địa chỉ của các biến từ bất kỳ kiểu dữ liệu nào. Những con trỏ này thường được gọi là 'con trỏ chung' (generic pointers).
Ví dụ:
#include
void add(int x, int y) {
int sum = x + y;
printf("Tổng của x và y là %d\n", sum);
}
int main() {
int x = 10, y = 20;
int *ptr = NULL;
add(x, y);
ptr = &x;
printf("Giá trị được lưu trữ trong con trỏ (ptr) sau khi tham chiếu %d\n", *ptr);
return 0;
}
Kết quả trả về trong chương trình ở ví dụ trên:
Tổng của x và y là 30
Giá trị được lưu trữ trong con trỏ (ptr) sau khi tham chiếu 10
Trong ví dụ này, hàm có tên 'add' có kiểu trả về là void, có nghĩa là nó sẽ không trả về bất kỳ giá trị nào cho phương thức chính. Vì vậy, người dùng phải in thông báo bên trong thân hàm hoặc viết một kiểu trả về khác.
Trên đây là một số thông tin cơ bản về các kiểu dữ liệu trong ngôn ngữ lập trình C. Hi vọng rằng những thông tin này sẽ giúp bạn hiểu rõ hơn về các kiểu dữ liệu và cách chúng được chia thành các danh mục con. Ngoài ra, còn nhiều thông tin liên quan khác bạn cần tìm hiểu, chúng được cập nhật đầy đủ và liên tục trên trang web của chúng tôi. Đừng bỏ qua nhé!