Tổng quan về cấu trúc trong ngôn ngữ lập trình Struct C

Trong việc học ngôn ngữ lập trình thì bạn sẽ phải làm quen với rất nhiều khái niêm, kiểu dữ liệu khác nhau. Hôm nay Box.edu sẽ giới thiệu cho các bạn về kiểu cấu trúc struct C trong lập trình. Vậy cấu trúc C là gì, cách sử dụng và ý nghĩa của nó như thế nào thì hãy cùng tìm hiểu kỹ hơn ở bài viết này nhé!

Xem thêm: Hướng dẫn đọc luồng C getline trong ngôn ngữ lập trình

Xem thêm: C scanf Function. Cách nhận dữ liệu người dùng qua ngôn ngữ C

Xem thêm: Hướng dẫn cách để tạo Vector trong C chính xác nhất

Mục lục bài viết

Tổng quan về cấu trúc struct C

tong-quan-ve-cau-truc-struct-c.jpg

Tổng quan về cầu trúc struct C

Nếu bạn có một tập hợp các dữ liệu, ví dụ như một loạt các dãy số, thì bạn có thể lưu trữ chúng dưới dạng một kiểu mảng trong C. Còn nếu chúng là một loạt các chuỗi, bạn cũng  có thể lưu trữ chúng dưới dạng một mảng chuỗi. Minh họa một cách dễ hiểu, giả sử bạn có một chuỗi đại diện cho các mặt hàng trên kệ cửa hàng tạp hóa và hai chuỗi số khác chứa hàng tồn kho và giá bán của mặt hàng đó, thì câu hỏi đặt ra là bạn làm cách nào để theo dõi mặt hàng này? Câu trả lời đó là bạn phải xem xét các kiểu dữ liệu phức tạp do người dùng xác định. Hay nó được gọi là cấu trúc (struct C).

Cách khai báo cấu trúc struct C

Đối với những bạn mới bắt đầu tìm hiểu về ngôn ngữ lập trình C thì bạn sẽ có lợi hơn khi sử dụng cấu trúc này, mẫu mã để khai báo cấu trúc được gọi là UserInfo và cũng đặt tên cho kiểu mới là ‘UserInfoDef’.

typedef struct UserInfo UserInfoDef;

struct UserInfo {

    char * tên_người dùng;   

    tuổi int;

};

struct GroceryItem {

    char * tên_mục;

    int còn lại_trong kho;

    float cost_price;

};

Trên thực tế kiểu khai báo này không mang lại nhiều giá trị, trừ khi bạn tạo các biến kiểu này và lưu trữ một vài thông tin trong chúng một cách cụ thể. Điều này sẽ được thực hiện bởi mã sau:

 struct UserInfo {     char * user_name;   

    tuổi int;

} user_a, user_b;

 user_a.user_name = “Nước sốt táo”;

 user_a.age = 21;

 user_b.user_name = “Củ cải đường”;

 user_b.age = 69;

Ví dụ cấu trúc struct C cơ bản

Đầu tiên bạn hãy tập hợp tất cả các dữ liệu này lại với nhau để tạo thành một chương trình đơn giản và in dữ liệu người dùng ra thiết bị đầu cuối. Bạn sẽ đọc được kết quả như sau:

#include <stdio.h>

struct UserInfo {

  char * tên_người dùng;   

  tuổi int;

};

void print_user (struct UserInfo * ptr) {

  printf ("% s ->% d \ n", ptr-> user_name, ptr-> age);

}

int main () {       

  struct UserInfo user_a, user_b, q;

  user_a.user_name = "Nước sốt táo";

  user_a.age = 21;

  user_b.user_name = "Củ cải";

  user_b.age = 69;

  q = user_b;

  q.age ++;

  print_user (& user_a);

  print_user (& user_b);  

  print_user (& q);  

  trả về 0;

}

Quá trình biên dịch và chạy chương trình sẽ cung cấp cho bạn kết quả đầu ra đó là:

Sốt táo -> 21  

Củ cải đường -> 69  

Củ cải đường -> 70  

Các hoạt động trên cấu trúc C

cac-hoat-dong-tren-cau-truc-c.jpg

Các hoạt động trên cấu trúc C

Thông thường với mỗi ngôn ngữ lập trình thì cấu trúc C sẽ thực hiện các hoạt động cụ thể là:

  • Đầu tiên là tạo ra một phần tử cấu trúc
  • Thêm nữa đó là hoạt động để tạo một mảng cấu trúc
  • Thực hiện xóa một cấu trúc
  • Sao chép một phần tử cấu trúc

Tạo cấu trúc động – Phân bổ bộ nhớ

Để tạo được cấu trúc trong thời gian chạy, ví dụ là từ những dữ liệu nhận được qua Internet, hoặc các thông tin người dùng nhập vào, hay các tệp đọc trên đĩa, chúng tôi cần biết số lượng cấu trúc hoặc bản ghi mà bạn muốn lưu trữ trên bộ nhớ. Vì tất cả thông tin này không có sẵn trong thời gian chạy, chúng tôi phải cấp phát bộ nhớ và tạo một không gian mới. 

Trong quy trình get_new_user_info này, bạn sẽ sử dụng hàm malloc, (hay sử dụng chỉ thị #include <stdlib.h>), lấy không gian bộ nhớ có thể sử dụng từ bộ nhớ heap trong hệ điều hành. Với ví dụ dưới đây bạn sẽ yêu cầu bộ nhớ cho cấu trúc dữ liệu UserInfoDef, cho số byte được cung cấp bởi toán tử C sizeof () có sẵn. Cụ thể là:

Ví dụ về danh sách được liên kết trong struct C

Trong ví dụ này, bạn đọc tệp trên UNIX có tên là: ‘/ etc / passwd’, là một phần mềm có danh sách số lượng người dùng và mật khẩu được mã hóa cũng như ID nhóm của họ. Khi các bạn thực hiện mở tệp có thuộc tính read, “r”, chúng tôi đã tạo ra một cấu trúc cho thông tin người dùng và kết nối các cấu trúc này với nhau trong một danh sách liên kết. Khi sử dụng cấu trúc dữ liệu này, chúng tôi đã xây dựng một danh sách các phần tử trong hàm và chuyển nó trở lại cho người sử dụng. Một khi tất cả đã kết hợp với nhau thì sẽ cho ra danh sách ‘struct_demo.c’ như dưới đây:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <khẳng định.h>

typedef struct UserInfo UserInfoDef;

struct UserInfo {

    char * tên_người dùng;   

    UserInfoDef * tiếp theo;    

};

UserInfoDef * get_new_user_info (const char * user_name) {

        UserInfoDef * user_curr = (UserInfoDef *) malloc (sizeof (UserInfoDef));

        user_curr-> next = NULL;

        user_curr-> user_name = (char *) malloc (sizeof (char) * strlen (user_name));        

        strcpy (user_curr-> user_name, user_name);

        trả về user_curr;

}

/ * trích xuất tên người dùng từ dòng / etc / passwd &

   và tìm tên người dùng dài nhất

* /

UserInfoDef * get_user_names (int * total_users) {

    UserInfoDef * user_begin = NULL;

    UserInfoDef * user_curr = NULL, * user_prev = NULL;

    const char * fname = "/ etc / passwd";

    FILE * fp = fopen (fname, "r");

    khẳng định (fp! = NULL);

    char line_data [512] = {0,}, * ptr = NULL;

    int line_no = 0;

    trong khi (! feof (fp)) {

        fgets (dữ liệu dòng, 512, fp);

        / * xóa các phần của dòng sau ':' * /

        ptr = dòng_dữ liệu;

        while (* ptr! = ':') {

            ptr ++;

        }

        * ptr = '';

        / * tên người dùng đầu ra * /

        printf ("% d)% s \ n", line_no, line_data);

        / * tạo một ID người dùng mới và sao chép tên người dùng hiện tại * /

       user_curr = get_new_user_info (dữ liệu dòng);

        / * cập nhật danh sách liên kết * /

       if (user_prev) {

             user_prev-> next = user_curr;

       }

       user_prev = user_curr;

        / * theo dõi đầu * /

        if (user_begin == NULL) {

              user_begin = user_curr;

        }

        dòng_no ++;

    }

    * total_users = line_no; // cập nhật rval

    trả về user_begin;

}

int main () {

    int total_users;

    UserInfoDef * user_begin = get_user_names (& total_users);

    UserInfoDef * pres = NULL;

    int count = 0;

    printf ("######## TỔNG SỐ NGƯỜI DÙNG% 04d ############## \ n", tổng số người dùng);

    trong khi (user_begin) {

        printf ("% 03d | name =% s \ n", ++ count, user_begin-> user_name);

        trước = user_begin;

        //tiến bộ

        user_begin = user_begin-> tiếp theo;

        // dọn dẹp bộ nhớ

        miễn phí (trước-> tên_người dùng);

        miễn phí (trước);

    }

}

/ ** gcc struct_demo.c -o struct_demo

   ./struct_demo * /

Cách chạy chương trình cấu trúc C

cach-chay-chuong-trinh-cau-truc-c.jpg

Cách chạy chương trình cấu trúc C

Bạn có thể tải chương trình cho nền tảng của mình từ trang web nguồn, http://gcc.gnu.org và chạy các bài kiểm tra và chương trình dưới dạng, $ gcc struct_demo.c -o struct_demo && ./struct_demo chính là lệnh để diễn giải mã và sau đó chạy chương trình như sau:

001 | name = apache

002 | name = gdm

.. <snip> ..

034 | name = mu2

035 | name = lightdm

036 | name = colord

037 | name = whoopsie

038 | name = mysql

039 | name = halla

040 | name = guest-r7Ir02 #

041 | name = guest-r7Ir02

Các nhà phát triển phần mềm hiện nay chủ yếu đều sử dụng cấu trúc dữ liệu tổng hợp. Để chứa các phần dữ liệu không đồng nhất. Cấu trúc là tập hợp những phần tử lớp đầu tiên trong ngôn ngữ C. Bạn có thể sử dụng để lưu trữ nhiều phần dữ liệu và xây dựng mảng từ. Và sử dụng hệ thống malloc / free. Các thuật toán nâng cao và cấu trúc dữ liệu như cây, đồ thị. Danh sách liên kết và bản đồ sẽ được xây dựng dựa trên cấu trúc trong C. Ngoài ra, các yếu tố chính của hệ điều hành như Linux. Cũng sẽ được viết trên các cấu trúc dữ liệu cơ bản này. 

Mảng struct trong C

Mảng được hiểu là tập hợp của các phần tử có cùng kiểu với nhau. Các phần tử này đều hoàn toàn có thể là kiểu dữ liệu struct.

Khi khai báo một mảng cấu trúc cũng giống như khai báo một mảng các kiểu cơ bản. Trong từng mảng cấu trúc, mỗi phần tử của mảng đều có kiểu cấu trúc khác nhau.

Ví dụ một mảng có kiểu sinh viên và lưu trữ 10 sinh viên. Thì bạn sẽ khai báo cấu trúc sinh viên trước và khai báo mảng. Có kiểu sinh viên bao gồm 10 phần tử ở trong hàm main như sau:

Khai báo struct sinhvien thường gồm các mục là: các trường Mã Sinh Viên, Tên Sinh Viên, Điểm Sinh Viên:

Khai báo mảng có kiểu sinhvien trong main:

Lúc này mảng SV arr_sv[10] sẽ có dạng cụ thể là:

Tổng kết

Hy vọng rằng những thông tin về struct C trong ngôn ngữ lập trình này. Sẽ cung cấp cho các bạn thêm mảng kiến thức mới. Hỗ trợ các bạn tốt hơn trong quá trình nghiên cứu, tìm hiểu sâu hơn về lập trình C. Để có thể thành thạo được thì bạn phải chăm chỉ rèn luyện. Và cố gắng đọc hiểu nhiều khái niệm, cũng như các thuật ngữ liên quan.

5/5 - (3 bình chọn)
Xin chào các bạn! Mình là Hà Nguyên Phương Hiện đang là tác giả của Box.edu.vn website nổi tiếng chuyên review, đánh giá, giới thiệu các khóa học hay nhất hiện nay.