BASIC
CONTROL STATEMENTS
DATA TYPE
FUNCTIONS
FILE I/O
THAM KHẢO
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Kiểu dữ liệu Struct trong 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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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.

Bài viết này được đăng tại [free tuts .net]

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\n");
    printf("Enter feet: ");
    scanf("%d", &dist1.feet);

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

    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:\n");
    printf("Age: %d\n", 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.

Cùng chuyên mục:

Các hàm xử lý mảng đa chiều (array.h) trong C/C++

Các hàm xử lý mảng đa chiều (array.h) trong C/C++

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý ngày tháng (datetime.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số thực (float.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý số nguyên lớn (bigint.h) trong C/C++

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý thời gian (time.h) trong C

Các hàm xử lý chuỗi (string.h) trong C/C++

Các hàm xử lý chuỗi (string.h) trong C/C++

Thread Pools và Parallel Algorithms trong C++

Thread Pools và Parallel Algorithms trong C++

Tạo và quản lý các Multithreading trong C++

Tạo và quản lý các Multithreading trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Xử lý ngoại lệ khi làm việc với Memory Allocation trong C++

Try, Catch, và Throw của Exception Handling trong C++

Try, Catch, và Throw của Exception Handling trong C++

Cách sử dụng Lambda Expressions trong C++

Cách sử dụng Lambda Expressions trong C++

Sử dụng weak_ptr trong C++

Sử dụng weak_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng shared_ptr trong C++

Sử dụng unique_ptr trong C++

Sử dụng unique_ptr trong C++

Tổng quan về Smart Pointers trong C++

Tổng quan về Smart Pointers trong C++

Sử dụng Iterators trong STL của C++

Sử dụng Iterators trong STL của C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng Vector trong C++

[Iterator] Sử dụng trong List trong C++

[Iterator] Sử dụng trong List trong C++

[STL] Sử dụng Vector trong C++

[STL] Sử dụng Vector trong C++

Tổng quan về Iterators trong C++

Tổng quan về Iterators trong C++

Top