Structure (โครงสร้าง) คืออะไร?
Structure คือการรวมตัวแปรที่มี **ชนิดข้อมูลต่างกัน** เข้าด้วยกันภายใต้ชื่อเดียว
คุณสมบัติของ Structure
- คัดลอกโครงสร้างทั้งชุดได้ด้วย
=(Assignment operator) - สามารถสร้าง **Nested Structure** (โครงสร้างซ้อนโครงสร้าง) ได้
- ส่งโครงสร้างทั้งชุด สมาชิกเดี่ยว หรือที่อยู่ โครงสร้าง ไปฟังก์ชันได้
- สามารถสร้าง **Pointer to Structure** ได้
ไวยากรณ์การประกาศ
struct tagname {
datatype member1;
datatype member2;
// ...
datatype memberN;
};
ตัวอย่าง: โครงสร้างใน Local Scope
#include <stdio.h>
// Global structure (นอกฟังก์ชัน)
struct {
char name[20];
int age;
int salary;
char add[30];
} emp1, emp2;
// ฟังก์ชันที่มี Local Structure
int manager() {
struct {
char name[20];
int age;
int salary;
char add[50];
} manager;
manager.age = 27;
if (manager.age > 30)
manager.salary = 65000;
else
manager.salary = 55000;
return manager.salary;
}
int main() {
// รับข้อมูล emp1
printf("Enter name of emp1: ");
scanf("%19s", emp1.name);
printf("Enter address of emp1: ");
scanf("%29s", emp1.add);
printf("Enter salary of emp1: ");
scanf("%d", &emp1.salary);
// รับข้อมูล emp2
printf("Enter name of emp2: ");
scanf("%19s", emp2.name);
printf("Enter address of emp2: ");
scanf("%29s", emp2.add);
printf("Enter salary of emp2: ");
scanf("%d", &emp2.salary);
printf("\nEmp1 salary: %d", emp1.salary);
printf("\nEmp2 salary: %d", emp2.salary);
printf("\nManager salary: %d", manager());
return 0;
}
ผลลัพธ์ตัวอย่าง:
Enter name of emp1: hari
Enter address of emp1: hyderabad
Enter salary of emp1: 4000
Enter name of emp2: lucky
Enter address of emp2: chennai
Enter salary of emp2: 5000
Emp1 salary: 4000
Emp2 salary: 5000
Manager salary: 55000
สรุปขอบเขต (Scope)
| ประเภท | ประกาศที่ | ขอบเขตที่เข้าถึงได้ |
|---|---|---|
| Global Struct | นอกฟังก์ชันทั้งหมด | ทุกฟังก์ชันในไฟล์ |
| Local Struct (ในฟังก์ชัน) | ภายในฟังก์ชัน | เฉพาะในฟังก์ชันนั้น |
| Local Struct (ใน Block {}) | ภายใน Block | เฉพาะใน Block นั้น |
หมายเหตุ
- Structure ที่ประกาศใน Block (เช่นใน
if,for,{}) จะมีขอบเขตเฉพาะ Block นั้น - Structure แบบไม่มี Tag Name (Anonymous) ไม่สามารถนำไปประกาศตัวแปรที่อื่นได้
- ใช้
typedefเพื่อสร้างชื่อชนิดข้อมูลใหม่ จะสะดวกกว่า