Search…

struct và union

17/09/20204 min read
Tìm hiểu về struct và union trong C/C++.

struct

Định nghĩa

struct là 1 tập hợp các phần tử dữ liệu cùng kiểu hoặc khác kiểu được gộp chung thành 1 nhóm. Các phần tử này được gọi là thành viên của struct.

Cú pháp

struct <Tên struct>
{
<Kiểu dữ liệu thành viên số 1> <Tên thành viên số 1>;
<Kiểu dữ liệu thành viên số 2> <Tên thành viên số 2>;
…
};

Ví dụ

struct Subject
{
	string	m_name_subject;
	string	m_pre_subject;
	int		m_hour_per_week;
	string	m_trainer;
};

Sử dụng struct

  • Để truy cập vào các thành viên của struct sử dụng toán tử dấu chấm (.) đặt giữa tên biến kiểu struct và tên thành viên của struct cần truy cập.

  • 1 biến thuộc kiểu struct cũng có thể trở thành tham số của 1 hàm.

  • Có thể truy cập thành phần của struct thông qua biến con trỏ.

Để rõ hơn, theo dõi đoạn mã nguồn dưới đây:

#include <iostream>
#include <string>
using namespace std;

/*Declare a struct called Subject*/
struct Subject
{
	string	m_name_subject;			//delare member types
	string	m_pre_subject;
	int		m_hour_per_week;
	string	m_trainer;
};

void PrintSubjectInformation(Subject object)
{
	cout << object.m_name_subject		<< endl;
	cout << object.m_trainer		<< endl;
	cout << object.m_hour_per_week	<< endl;
	cout << object.m_pre_subject		<< endl;
}

int main()
{
	Subject subject;

	// Access the member of struct Subject through subject
	subject.m_name_subject	= "Game Programming";
	subject.m_pre_subject	= "Basic Programming";
	subject.m_hour_per_week = 4;
	subject.m_trainer		= "Vu Quang Huy";

	PrintSubjectInformation(subject);

	return 0;
}

union

Định nghĩa

Cũng giống như struct, union là 1 tập hợp các phần tử dữ liệu cùng kiểu hoặc khác kiểu được gộp chung thành 1 nhóm. Các phần tử này được gọi là thành viên của union.

Cú pháp

union <Tên struct>
{
<Kiểu dữ liệu thành viên số 1> <Tên thành viên số 1>;
<Kiểu dữ liệu thành viên số 2> <Tên thành viên số 2>;
…
};

Ví dụ

union <Tên struct>
{
<Kiểu dữ liệu thành viên số 1> <Tên thành viên số 1>;
<Kiểu dữ liệu thành viên số 2> <Tên thành viên số 2>;
…
};

Sử dụng union

  • Để truy cập vào các thành viên của union sử dụng toán tử dấu chấm (.) đặt giữa tên biến kiểu union và tên thành viên của union cần truy cập.

  • 1 biến thuộc kiểu union cũng có thể trở thành tham số của 1 hàm.

  • Có thể truy cập thành viên của union thông qua biến con trỏ.

Để rõ hơn, có thể theo dõi đoạn mã nguồn dưới đây:

#include <iostream>

using namespace std;

/* Declare */
union Post
{
	int		m_iValue;
	float		m_fValue;			//delare member types
	long		m_lValue;
};

void PrintSubjectInformation(Post post)
{
	cout << post.m_iValue	<< endl;
	cout << post.m_fValue	<< endl;
	cout << post.m_lValue	<< endl;
}

int main()
{
	Post post;
	post.m_iValue		= 169;			// Access the member of union
	post.m_fValue		= 39.01;
	post.m_lValue		= 123;

	PrintSubjectInformation(post);

	return 0;
}

Output

 

Khi thay đổi giá trị post.m_lValue = 123; đã làm ảnh hướng đến giá trị của các thành viên còn lại. Điều này sẽ được giải thích ở phần sau.

So sánh struct và union

Về mặt ý nghĩa, struct và union cơ bản giống nhau. Tuy nhiên, về mặt lưu trữ trong bộ nhớ, chúng có sự khác biệt rõ rệt như sau:

  • struct: Dữ liệu của các thành viên của struct được lưu trữ ở những vùng nhớ khác nhau. Do đó kích thước của 1 struct chắc chắn lớn hơn kích thước của các thành viên cộng lại.

Tại sao lại lớn hơn kích thước của thành viên?

Lý do

Tùy thuộc và kích thước của khối nhớ do hệ thống quy định.

Ví dụ

Hệ thống quy định khối nhớ là 1 byte, thì kích thước của kiểu dữ liệu sSinhVien là 13 bytes.

struct sSinhVien
{
	char	m_id[5];
	float	m_height;
	float	m_weight;
};

Thông tin thêm

  • struct: thực tế struct trên nếu lấy kích thước thông thường sẽ có "hiệu ứng" Alignment nên kích thước sẽ không phải là 13 bytes, có thể đọc thêm bài Struct Alignment Trong C++.
  • union: với union, các thành viên sẽ dùng chung 1 vùng nhớ. Kích thước của union được tính là kích thước lớn nhất của kiểu dữ liệu trong union. Việc thay đổi nội dung của 1 thành viên sẽ dẫn đến thay đổi nội dung của các thành viên khác.

 

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024