C - Loại dữ liệu
Xin chào các bạn tương lai của lập trình! Chào mừng các bạn đến với hành trình thú vị vào thế giới lập trình C. Hôm nay, chúng ta sẽ khám phá thế giới kỳ diệu của các loại dữ liệu trong C. Đừng lo lắng nếu bạn là người mới bắt đầu; tôi sẽ là người hướng dẫn thân thiện của bạn, và chúng ta sẽ cùng nhau giải quyết chủ đề này từng bước. Vậy, hãy lấy饮料 yêu thích của bạn, ngồi thoải mái, và cùng nhau bắt đầu!
Các loại dữ liệu nguyên thủy trong C
Hãy bắt đầu với điều chúng ta đều quen thuộc - số nguyên. Trong C, chúng ta gọi chúng là integers, và chúng có kích thước và kiểu khác nhau.
Các loại integer cơ bản
Dưới đây là bảng các loại integer phổ biến nhất trong C:
Loại dữ liệu | Kích thước (bytes) | Phạm vi |
---|---|---|
char | 1 | -128 đến 127 hoặc 0 đến 255 |
short | 2 | -32,768 đến 32,767 |
int | 4 | -2,147,483,648 đến 2,147,483,647 |
long | 4 hoặc 8 | -2,147,483,648 đến 2,147,483,647 hoặc -9,223,372,036,854,775,808 đến 9,223,372,036,854,775,807 |
Bây giờ, hãy xem chúng trong hành động:
#include <stdio.h>
int main() {
char my_char = 65;
short my_short = 32000;
int my_int = 2000000000;
long my_long = 9000000000L;
printf("char: %c\n", my_char);
printf("short: %d\n", my_short);
printf("int: %d\n", my_int);
printf("long: %ld\n", my_long);
return 0;
}
Khi bạn chạy đoạn mã này, bạn sẽ thấy:
char: A
short: 32000
int: 2000000000
long: 9000000000
Hãy phân tích điều này:
- Giá trị
char
65 tương ứng với 'A' trong bảng ASCII. Ngạc nhiên!char
có thể lưu trữ số nguyên cũng! -
short
vàint
hoạt động như mong đợi cho các số trung bình. - Đối với
long
, chúng ta thêm một 'L' ở cuối để cho C biết đó là một số lớn.
Các số nguyên không dấu
Đôi khi, chúng ta chỉ cần số nguyên dương. Đó là khi các số nguyên không dấu trở nên hữu ích:
unsigned char my_uchar = 255;
unsigned short my_ushort = 65000;
unsigned int my_uint = 4000000000U;
printf("unsigned char: %u\n", my_uchar);
printf("unsigned short: %u\n", my_ushort);
printf("unsigned int: %u\n", my_uint);
Kết quả đầu ra:
unsigned char: 255
unsigned short: 65000
unsigned int: 4000000000
Bằng cách sử dụng unsigned
, chúng ta có thể lưu trữ các số nguyên dương lớn hơn trong cùng một lượng bộ nhớ. Đó như phép thuật, nhưng thực ra chỉ là cách sử dụng bit thông minh!
Các loại dữ liệu số động trong C
Bây giờ, hãy nhảy vào thế giới của các số thập phân. C cung cấp ba loại số động:
Loại dữ liệu | Kích thước (bytes) | Độ chính xác |
---|---|---|
float | 4 | 6-7 chữ số thập phân |
double | 8 | 15-16 chữ số thập phân |
long double | 16 | 19-20 chữ số thập phân |
Hãy xem chúng trong hành động:
#include <stdio.h>
int main() {
float pi_float = 3.14159265358979323846f;
double pi_double = 3.14159265358979323846;
long double pi_long_double = 3.14159265358979323846L;
printf("float: %.7f\n", pi_float);
printf("double: %.16f\n", pi_double);
printf("long double: %.20Lf\n", pi_long_double);
return 0;
}
Kết quả đầu ra:
float: 3.1415927
double: 3.1415926535897931
long double: 3.14159265358979323846
Chú ý rằng float
mất độ chính xác sau 7 chữ số, trong khi double
và long double
duy trì độ chính xác hơn. Đó như việc phóng to ảnh kỹ thuật số - ở một mức độ nào đó, bạn bắt đầu thấy các điểm ảnh!
Các loại dữ liệu do người dùng định nghĩa trong C
C cho phép chúng ta tạo ra các loại dữ liệu của riêng mình. Đó như việc làm đầu bếp và tạo ra các công thức của riêng bạn!
Cấu trúc
Cấu trúc cho phép chúng ta nhóm các dữ liệu liên quan lại với nhau:
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
struct Student alice;
strcpy(alice.name, "Alice");
alice.age = 20;
alice.gpa = 3.8;
printf("Name: %s\n", alice.name);
printf("Age: %d\n", alice.age);
printf("GPA: %.1f\n", alice.gpa);
return 0;
}
Kết quả đầu ra:
Name: Alice
Age: 20
GPA: 3.8
Ở đây, chúng ta đã tạo ra một loại Student
mà gộp tên, tuổi và GPA lại với nhau. Đó như việc tạo một biểu mẫu cho thông tin học sinh!
Enumeration
Enumeration rất hữu ích để tạo ra một tập hợp các hằng số có tên:
#include <stdio.h>
enum Days {SUN, MON, TUE, WED, THU, FRI, SAT};
int main() {
enum Days today = WED;
printf("Today is day number %d\n", today);
return 0;
}
Kết quả đầu ra:
Today is day number 3
Enums tự động gán giá trị nguyên dãy tăng dần bắt đầu từ 0. Đó như việc đặt biệt danh cho các số!
Loại dữ liệu void trong C
void
là một loại đặc biệt trong C. Nó như một canvas trống - nó đại diện cho sự vắng mặt của dữ liệu. Chúng ta chủ yếu sử dụng nó trong ba kịch bản:
-
Hàm không trả về gì:
void sayHello() { printf("Hello, World!\n"); }
-
Hàm không nhận tham số:
int getRandomNumber(void) { return 4; // được chọn bởi cách tung骰子. đảm bảo rằng nó ngẫu nhiên. }
-
Các con trỏ tổng quát (chúng ta sẽ xem xét trong phần con trỏ)
Loại dữ liệu mảng trong C
Mảng là như một hàng pigeonholes, mỗi cái chứa một giá trị cùng loại:
#include <stdio.h>
int main() {
int scores[5] = {85, 92, 78, 90, 88};
printf("First score: %d\n", scores[0]);
printf("Last score: %d\n", scores[4]);
float average = 0;
for(int i = 0; i < 5; i++) {
average += scores[i];
}
average /= 5;
printf("Average score: %.2f\n", average);
return 0;
}
Kết quả đầu ra:
First score: 85
Last score: 88
Average score: 86.60
Nhớ rằng, trong C, chỉ số mảng bắt đầu từ 0. Đó như việc các tầng nhà ở châu Âu - tầng đất là 0!
Loại dữ liệu con trỏ trong C
Con trỏ là như các biển hiệu chỉ đến các vị trí trong bộ nhớ. Chúng mạnh mẽ nhưng có thể khó khăn:
#include <stdio.h>
int main() {
int x = 10;
int *p = &x;
printf("Value of x: %d\n", x);
printf("Address of x: %p\n", (void*)&x);
printf("Value of p: %p\n", (void*)p);
printf("Value pointed by p: %d\n", *p);
*p = 20;
printf("New value of x: %d\n", x);
return 0;
}
Kết quả đầu ra (địa chỉ sẽ thay đổi):
Value of x: 10
Address of x: 0x7ffd5e8e3964
Value of p: 0x7ffd5e8e3964
Value pointed by p: 10
New value of x: 20
Ở đây, p
là một con trỏ lưu trữ địa chỉ của x
. Chúng ta có thể sử dụng *p
để truy cập hoặc thay đổi giá trị tại địa chỉ đó. Đó như việc có một remote control cho x
!
Và thế là xong! Chúng ta đã xem qua các loại dữ liệu chính trong C. Nhớ rằng, việc hiểu các loại dữ liệu là rất quan trọng vì nó giúp bạn quản lý bộ nhớ hiệu quả và tránh lỗi. Hãy tiếp tục thực hành, và sớm bạn sẽ có thể xử lý các loại dữ liệu này như một chuyên gia! Chúc các bạn lập trình vui vẻ!
Credits: Image by storyset