06/04/2021, 14:47

Kiểu dữ liệu Struct trong C - Học lập trình C căn bản & nâng cao

Trong bài này chúng ta sẽ học về cách khai báo và sử dụng kiểu dữ liệu Struct trong lập trình C, struct sẽ giúp bạn tạo ra những loại dữ liệu phức tạp mà không cần đến lập trình hướng đối tượng. Trong lập trình C/C++, struct (struct collection) là một tập hợp các biến (có thể có nhiều kiểu khác ...

Trong bài này chúng ta sẽ học về cách khai báo và sử dụng kiểu dữ liệu Struct trong lập trình C, struct sẽ giúp bạn tạo ra những loại dữ liệu phức tạp mà không cần đến lập trình hướng đối tượng.

Trong lập trình C/C++, struct (struct collection) là một tập hợp các biến (có thể có nhiều kiểu khác nhau) dưới một tên duy nhất. Ví dụ kiểu Connguoi thì có các thông tin như: Tên, giới tính, năm sinh.

1. Cách định nghĩa Struct trong C

Để định nghĩa struct trong C hoặc C++ thì bạn đều sử dụng từ khóa struct, sau đó là thông tin của dữ liệu theo cú pháp như sau:

struct structureName 
{
    dataType member1;
    dataType member2;
    ...
};

Dưới đây là một ví dụ cách định nghĩa struct Person.

struct Person
{
    char name[50];
    int citNo;
    float salary;
};

2. Khai báo biến struct trong C

Ở trên là bạn chỉ mới định nghĩa kiểu dữ liệu mà thôi, và sau khi định nghĩa xong thì bạn có thể khởi tạo nó một cách bình thường như bao kiểu dữ liệu khác.

Hãy xem ví dụ dưới đây, mình đã tạo nhiều biến kiểu Persion khác nhau, thậm chí là một mảng các persion.

struct Person
{
    char name[50];
    int citNo;
    float salary;
};

int main()
{
    struct Person person1, person2, p[20];
    return 0;
}

Bạn có thể định nghĩa struct ở bên trong hay bên ngoài hàm main đều được.

Dưới đây cũng là cách vừa định nghĩa và khai báo vừa khai báo biến struc cùng một lúc.

struct Person
{
    char name[50];
    int citNo;
    float salary;
} person1, person2, p[20];

Mặc dù khai báo nhanh nhưng không khuyến khích sử dụng cách này bởi khi chương trình phình to ra hàng ngàn dòng code thì bạn không thể quản lý nó nổi đâu nhé.

3. Truy cập đến các phần tử của Struct

Mỗi struct sẽ có nhiều thuộc tính con nên ta cần phải học các truy xuất / gán dữ liệu cho thuộc tính đó.

Có hai cách như sau:

  • Sử dụng dấu chấm . cho trường hợp biên thông thường
  • Sử dụng dấu mũi tên -> cho trường hợp biến con trỏ.

Ví dụ: Truy cập vào mức lương của person2.

person2.salary

Quá đơn giản phải không các bạn?

Ví dụ biến struct thông thường

Sau đây là một ví dụ dài hơn.

// Program to add two distances (feet-inch)
#include <stdio.h>
struct Distance
{
    int feet;
    float inch;
} dist1, dist2, sum;

int main()
{
    printf("1st distance
");
    printf("Enter feet: ");
    scanf("%d", &dist1.feet);

    printf("Enter inch: ");
    scanf("%f", &dist1.inch);
    printf("2nd distance
");

    printf("Enter feet: ");
    scanf("%d", &dist2.feet);

    printf("Enter inch: ");
    scanf("%f", &dist2.inch);

    // adding feet
    sum.feet = dist1.feet + dist2.feet;
    // adding inches
    sum.inch = dist1.inch + dist2.inch;

    // changing to feet if inch is greater than 12
    while (sum.inch >= 12) 
    {
        ++sum.feet;
        sum.inch = sum.inch - 12;
    }

    printf("Sum of distances = %d'-%.1f"", sum.feet, sum.inch);
    return 0;
}

Chạy chương trình và nhập dữ liệu vào thì bạn sẽ có kết quả dạng như sau:

1st distance
Enter feet: 12
Enter inch: 7.9
2nd distance
Enter feet: 2
Enter inch: 9.8
Sum of distances = 15'-5.7"

Ví dụ biến struct pointer

Với con trỏ thì ta phải sử dụng dấu mũi tên nhé.

#include <stdio.h>
struct person
{
   int age;
   float weight;
};

int main()
{
    struct person *personPtr, person1;
    personPtr = &person1;   

    printf("Enter age: ");
    scanf("%d", &personPtr->age);

    printf("Enter weight: ");
    scanf("%f", &personPtr->weight);

    printf("Displaying:
");
    printf("Age: %d
", personPtr->age);
    printf("weight: %f", personPtr->weight);

    return 0;
}

4. Tạo tên mới cho struct với từ khóa typedef

Nếu bạn muốn đặt một cái tên khác cho struct ngắn gọn hơn thì có thể sử dụng từ khóa typedef, và ta gọi đây là tên nặc danh.

Ví dụ: Đặt lại tên Distances chữ thường.

typedef struct Distance{
    int feet;
    float inch;
} distances;

int main() {
    distances d1, d2;
}

5. Bên trong struct chứa một struct khác

Các dữ liệu của struct cũng có thể là một kiểu struct khác. Ví dụ:

struct complex
{
 int imag;
 float real;
};

struct number
{
   struct complex comp;
   int integers;
} num1, num2;

Và khi truy xuất đến các phần tử này thì ta sử dụng hai dấu chấm liên tiếp:

num2.comp.imag = 11;

6. Tại sao nên sử dụng Struct trong C?

Nếu bạn chưa học về lập trình hướng đối tượng thì rõ ràng Struct là kiểu dữ liệu rất quan trọng, nó giúp ta lưu trữ những loại dữ liệu phức tạp chứa nhiều thông tin.

Ví dụ cần lưu trữ thông tin các thành phố tại USA, mỗi thành phố sẽ có có nhiều thông tin như:

  • Tên thành phố
  • Địa chỉ
  • Mã bưu chính
  • ...

Nếu mỗi thành phố ta tạo một biến lưu trữ thì sẽ cần hàng ngàn biến, đó là điều rất tệ hại. Nhưng nếu sử dụng struct thì ta chỉ cần một biến mà thôi, vì bên trong biến đó đã có đầy đủ thông tin.

Trên là những chia sẻ về Struct trong ngôn ngữ C, hy vọng bạn hiểu rõ về struct và áp dụng nó trong quá trình học một cách tốt nhất.

Hoàng Hải Đăng

24 chủ đề

7226 bài viết

Cùng chủ đề
0