Pointer to Structure
Pointer to structure คือ pointer ที่เก็บที่อยู่ของ structure ทั้งหมด ใช้สร้างโครงสร้างข้อมูลซับซ้อนเช่น linked lists, trees, graphs
การประกาศ
struct tagname *ptr;
ตัวอย่าง: struct student *s;
การเข้าถึงสมาชิก
ใช้ arrow operator (->)
ptr->membername;
ตัวอย่าง: s->sno, s->sname, s->marks;
ฟังก์ชันจัดสรรหน่วยความจำไดนามิก
- malloc(size) - จัดสรรหน่วยความจำตามไบต์ที่ระบุ
- calloc(n, size) - จัดสรรบล็อกต่อเนื่อง n บล็อก ขนาด size ไบต์ และตั้งค่าเป็น 0
- realloc(ptr, new_size) - ปรับขนาดหน่วยความจำที่จัดสรรไว้
- free(ptr) - คืนหน่วยความจำ
ตัวอย่างโปรแกรมที่ 1: จัดสรรหน่วยความจำสำหรับ Array of Structures แบบไดนามิก
#include <stdio.h>
#include <stdlib.h>
struct person {
int age;
float weight;
char name[30];
};
int main() {
struct person *ptr;
int i, n;
printf("ป้อนจำนวนคน: ");
scanf("%d", &n);
// จัดสรรหน่วยความจำสำหรับ n โครงสร้าง person
ptr = (struct person*) malloc(n * sizeof(struct person));
if (ptr == NULL) {
printf("จัดสรรหน่วยความจำล้มเหลว\\n");
return 1;
}
for (i = 0; i < n; ++i) {
printf("ป้อนชื่อและอายุคนที่ %d: ", i+1);
scanf("%s %d", (ptr+i)->name, &(ptr+i)->age);
}
printf("\\nข้อมูลที่ป้อน:\\n");
for (i = 0; i < n; ++i) {
printf("ชื่อ: %s\\tอายุ: %d\\n", (ptr+i)->name, (ptr+i)->age);
}
free(ptr); // คืนหน่วยความจำ
return 0;
}ผลลัพธ์ตัวอย่าง
ป้อนจำนวนคน: 1 ป้อนชื่อและอายุคนที่ 1: bhanu 24 ข้อมูลที่ป้อน: ชื่อ: bhanu อายุ: 24
ตัวอย่างโปรแกรมที่ 2: ใช้ Pointer กับ Array of Structures (ไม่ใช่ malloc)
#include <stdio.h>
struct Manager {
char Name[15];
int Age;
char Gender;
float Level;
char Role[50];
char temp;
} m[20];
int main() {
int i;
struct Manager *p = &m[0]; // pointer ชี้ตัวแรกของ array
for (i = 0; i < 2; i++) {
printf("ป้อนชื่อผู้จัดการ %d: ", i+1);
gets(p->Name); // ควรใช้ fgets แทน
printf("ป้อนอายุ %d: ", i+1);
scanf("%d", &p->Age);
scanf("%c", &p->temp); // clear buffer
printf("ป้อนเพศ %d: ", i+1);
scanf("%c", &p->Gender);
printf("ป้อนระดับ %d: ", i+1);
scanf("%f", &p->Level);
scanf("%c", &p->temp); // clear buffer
printf("ป้อนบทบาท %d: ", i+1);
gets(p->Role);
p++; // ขยับไป element ถัดไป
}
p = &m[0]; // reset pointer
for (i = 0; i < 2; i++) {
printf("ผู้จัดการ %d: %s, อายุ %d, เพศ %c, ระดับ %.0f, บทบาท %s\\n",
i+1, p->Name, p->Age, p->Gender, p->Level, p->Role);
p++;
}
return 0;
}คำอธิบายสำคัญ
- การใช้
(ptr+i)->memberเทียบเท่ากับptr[i].member - ต้องตรวจสอบค่า NULL หลัง malloc/calloc/realloc เสมอ
- ต้อง free() หน่วยความจำเมื่อไม่ใช้แล้ว เพื่อป้องกัน memory leak