chim bay

Thursday, November 12, 2015

Struct và Union khác nhau như thế nào ?

struct

Định nghĩa

Struct là một 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 một nhóm. Các phần tử này được gọi là thành viên của struct.

Cú pháp

  1. struct <Tên struct>
  2. {
  3. <Kiu d liu thành viên s 1> <Tên thành viên s 1>;
  4. <Kiu d liu thành viên s 2> <Tên thành viên s 2>;
  5. };

Ví dụ

  1. struct Subject
  2. {
  3. string m_name_subject;
  4. string m_pre_subject;
  5. int m_hour_per_week;
  6. string m_trainer;
  7. };

Sử dụng struct

  • Để truy cập vào các thành viên của struct ta 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.
  • Một biến thuộc kiểu struct cũng có thể trở thành tham số của một hàm.
  • Có thể truy cập thành phần của struct thông qua biến con trỏ.
Để rõ hơn, các bạn có thể theo dõi đoạn mã nguồn dưới đây:
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. /*Declare a struct called Subject*/
  6. struct Subject
  7. {
  8. string m_name_subject; //delare member types
  9. string m_pre_subject;
  10. int m_hour_per_week;
  11. string m_trainer;
  12. };
  13.  
  14. void PrintSubjectInformation(Subject object)
  15. {
  16. cout << object.m_name_subject << endl;
  17. cout << object.m_trainer << endl;
  18. cout << object.m_hour_per_week << endl;
  19. cout << object.m_pre_subject << endl;
  20. }
  21.  
  22. int main()
  23. {
  24. Subject subject;
  25.  
  26. // Access the member of struct Subject through subject
  27. subject.m_name_subject = "Game Programming";
  28. subject.m_pre_subject = "Basic Programming";
  29. subject.m_hour_per_week = 4;
  30. subject.m_trainer = "Brian Vu";
  31.  
  32. PrintSubjectInformation(subject);
  33.  
  34. return 0;
  35. }

union

Định nghĩa

Cũng giống như struct, union là một 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 một nhóm. Các phần tử này được gọi là thành viên của union

Cú pháp

  1. union <Tên struct>
  2. {
  3. <Kiu d liu thành viên s 1> <Tên thành viên s 1>;
  4. <Kiu d liu thành viên s 2> <Tên thành viên s 2>;
  5. };

Ví dụ

  1. union <Tên struct>
  2. {
  3. <Kiu d liu thành viên s 1> <Tên thành viên s 1>;
  4. <Kiu d liu thành viên s 2> <Tên thành viên s 2>;
  5. };

Sử dụng union

  • Để truy cập vào các thành viên của union ta 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.
  • Một biến thuộc kiểu union cũng có thể trở thành tham số của một 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ác bạn có thể theo dõi đoạn mã nguồn dưới đây:
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. /* Declare */
  6. union Post
  7. {
  8. int m_iValue;
  9. float m_fValue; //delare member types
  10. long m_lValue;
  11. };
  12.  
  13. void PrintSubjectInformation(Post post)
  14. {
  15. cout << post.m_iValue << endl;
  16. cout << post.m_fValue << endl;
  17. cout << post.m_lValue << endl;
  18. }
  19.  
  20. int main()
  21. {
  22. Post post;
  23. post.m_iValue = 169; // Access the member of union
  24. post.m_fValue = 39.01;
  25. post.m_lValue = 123;
  26.  
  27. PrintSubjectInformation(post);
  28.  
  29. return 0;
  30. }

Output

Khi thay đổi giá trị post.m_lValue = 123;. Ta đã 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 một 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 byte.
  1. struct sSinhVien
  2. {
  3. char m_id[5];
  4. float m_height;
  5. float m_weight;
  6. };
  • union: với union, các thành viên sẽ dùng chung một 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 một thành viên sẽ dẫn đến thay đổi nội dung của các thành viên khác.

0 comments:

Post a Comment