back to main...

ข้อมูลชนิดโครงสร้าง (Structure)

ความหมาย และการสร้างข้อมูลชนิดโครงสร้าง

ข้อมูลชนิดโครงสร้าง เป็นการรวมกลุ่มของตัวแปรต่าง ๆ เข้าด้วยกันไว้
ภายใต้ชื่อเพียงชื่อเดียว เช่น ข้อมูลที่เกี่ยวข้องกับพนักงานของบริษัท
แห่งหนึ่งประกอบด้วย ชื่อ ที่อยู่ เงินเดือน อายุ ถ้าต้องการนำข้อมูล
เหล่านี้ไปเก็บไว้ในหน่วยความจำก็ต้องเตรียมตัวแปรให้กับข้อมูล
พร้อมทั้งบอกชนิดของข้อมูลด้วย เช่น

ข้อมูลชื่อตัวแปรชนิด
ชื่อnamechar
ที่อยู่addresschar
เงินเดือนsalaryfloat
อายุageint

เมื่อมีการนำข้อมูลเหล่านี้ไปใช้งานทั้งกลุ่ม ในภาษา C สามารถทำได้ โดย
ตั้งชื่อให้กับกลุ่มข้อมูลเหล่านี้ เมื่อต้องการนำไปใช้ก็อ้างถึงชื่อของ
กลุ่มข้อมูลนี้ได้เลย ลักษณะการจัดข้อมูลแบบนี้เรียกว่าการจัดข้อมูล
ชนิดโครงสร้าง
(structure) ซึ่งมีลักษณะเหมือนกับการจัดข้อมูล
ชนิด record ในภาษา pascal

รูปแบบ

	struct struc-name{
		type name-1;
		type name-2;
		:
		:
		type name-n;
	}  struc - variable;

struc-nameชื่อกลุ่มโครงสร้าง
typeชนิดตัวแปรที่อยู่ในกลุ่มโครงสร้าง
name-1, name-2, name-nชื่อของตัวแปรที่อยู่ในกลุ่มโครงสร้าง
struc-variableตัวแปรชนิดโครงสร้าง หมายถึง ตัวแปรที่มีโครงสร้างเหมือนกับ
ที่ประกาศไว้ในชื่อของกลุ่มโครงสร้างซึ่งอาจจะมีหรือไม่มีก็ได้
และถ้ามีมากกว่า 1 ชื่อ จะแยกกันด้วยเครื่องหมายคอมม่า (,)

ตัวอย่าง

	struct employee{
		char name[30];
		char address[20];
		float salary;
		int age;
	}  personel;

คำอธิบาย

จากตัวอย่างเป็นการกำหนดให้ตัวแปร employee เป็นชื่อของกลุ่ม
โครงสร้างที่ประกอบด้วย ตัวแปร name[30];, address[20];, salary และ
age โดยมีตัวแปร personel เป็นตัวแปรชนิดโครงสร้างที่มีข้อมูลแบบ
เดียวกับตัวแปร employee

การกำหนดให้ตัวแปรมีโครงสร้างข้อมูลเหมือนกับชื่อกลุ่มโครงสร้างที่ประกาศไว้แล้ว

เราสามารถกำหนดให้ตัวแปรอื่น ๆ มีโครงสร้างข้อมูลเหมือนกับชื่อกลุ่ม
โครงสร้างที่ประกาศไว้แล้วโดยใช้คำสั่ง struct

รูปแบบ

struct struc-name struc-variable;

struc-nameชื่อกลุ่มโครงสร้างที่ประกาศลักษณะไว้แล้ว
struc-variableชื่อตัวแปรชนิดโครงสร้าง
ถ้ามีมากกว่าหนึ่งตัวจะแยกกันด้วยเครื่องหมายคอมม่า(,)

ตัวอย่าง

struct ident add-per, emp;

คำอธิบาย

ประกาศให้ add-per และ emp เป็นตัวแปรชนิดโครงสร้างที่มีลักษณะ
โครงสร้างข้อมูลเหมือนกับชื่อกลุ่มโครงสร้าง ident ที่ประกาศไว้แล้ว

การอ้างถึงตัวแปรที่อยู่ในตัวแปรชนิดโครงสร้าง

เราสามารถที่จะอ้างถึงตัวแปรที่อยู่ในตัวแปรชนิดโครงสร้างได้ โดยใช้

รูปแบบ

struc-Variable.element-name

struc-Variable ชื่อตัวแปรชนิดโครงสร้าง
element-name ชื่อตัวแปรที่อยู่ภายในกลุ่มโครงสร้าง

ตัวอย่าง

จากตัวอย่างที่ผ่านมา ถ้าต้องการนำตัวแปร salary มาใช้งานก็จะอ้างถึง
ตัวแปร salary ได้ดังนี้

personel.salary

การนำข้อมูลเข้ามาเก็บและแสดงผลตัวแปรชนิดโครงสร้าง

การนำข้อมูลเข้ามาเก็บในตัวแปรชนิดโครงสร้างสามารถทำได้หลายวิธี คือ

  • ใช้วิธีกำหนดค่าคงที่ในขณะเรียกใช้ เช่น personel.salary = 7500.00;
  • ตัวอย่าง

    	#include<stdio.h>
    	void main(void)
    	{
    		struct account{
    			char name[30];
    			char addr[20];
    			float salary;
    			int age;
    		}  new;
    		strcpy (new.name,"Somchai");
    		strcpy (new.addr,"Bangkok");
    		new.salary = 7500;
    		new.age = 35;
    		printf ("NAME : %s \n ADDRESS : %s \n 
    			SALARY : %2f \n AGE : %d", new.name,
    			 new.address, new.salary, new.age);
    	}

    ผลลัพธ์

    NAME : Somchai
    ADDRESS : Bangkok
    SALARY : 7500.00
    age : 35

  • ใช้วิธีรับเข้ามาจากแป้นพิมพ์โดยใช้ฟังก์ชันในการรับข้อมูล เช่น
  • ตัวอย่าง

    gets (employee.name);

    ให้รับข้อมูลจากแป้นพิมพ์มาเก็บไว้ในตัวแปร name ที่อยู่ภายในตัวแปร
    ชนิดโครงสร้างที่ชื่อ employee

    ตัวแปรชุดชนิดโครงสร้าง

    ในกรณีที่มีข้อมูลจำนวนมาก แล้วต้องการเก็บไว้ในหน่วยความจำทั้งหมด
    เพื่อทำการประมวลอย่างใดอย่างหนึ่ง เราสามารถเตรียมลักษณะข้อมูล
    เป็นชนิดโครงสร้างได้เช่น ต้องการเตรียมข้อมูลของพนักงาน 10 คน ที่แต่
    ละคนประกอบด้วย ชื่อ ที่อยู่ เงินเดือน อายุ สามารถเขียนเป็นลักษณะ
    โครงสร้างได้โดยใช้ลักษณะของตัวแปรชุดมาช่วย ตัวแปรชุดที่ต้องการ
    ประกาศในลักษณะนี้เรียกว่า ตัวแปรชุดชนิดโครงสร้าง ซึ่งสามารถ
    ประกาศได้ดังนี้

    	struct employee{
    		char name[30];
    		char address[20];
    		float salary;
    		int age;
    		} input[10];

    ตัวอย่าง

    ให้นำค่า 9500 ไปเก็บในตัวแปร salary ของพนักงานคนที่ 2

    input[1].salary = 9500

    การส่งตัวแปรชนิดโครงสร้างไปยังฟังก์ชัน

    นอกจากตัวแปรธรรมดาที่มีการส่งกันระหว่างฟังก์ชันแล้ว ตัวแปรชนิด
    โครงสร้างก็สามารถส่งไปยังฟังก์ชันได้เช่นกัน โดยจะส่งค่ากันได้หลาย
    รูปแบบ ดังนี้

  • การส่งเฉพาะตัวแปรที่อยู่ในตัวแปรชนิดโครงสร้างไปยังฟังก์ชันที่ถูกเรียกใช้

  • ตัวอย่าง

    ถ้าต้องการส่งค่าตัวแปร x, y, z และ s ซึ่งอยู่ในตัวแปรชนิดโครงสร้างที่ชื่อ
    sample ไปยังฟังก์ชันต่าง ๆ ที่ชื่อ f1, f2, f3, f4,f5

    	struct{
    		char	x;
    		int	y;
    		float	z;
    		char	s[10];
    	} sample;
    	:
    	:
    	f1(sample.x);	
    	f2(sample.y);		
    	f3(sample.z);
    	f4(sample.s);		
    	f5(sample.s[2]);	
    	:
    	:
    

  • การส่งเฉพาะตำแหน่งที่อยู่ (address) ของตัวแปรที่อยู่ในตัวแปรชนิด
    โครงสร้างไปยังฟังก์ชันที่ถูกเรียกใช้

  • การส่งค่าไปทำงานไม่จำเป็นต้องส่งค่าของตัวแปรไปก็ได้ สามารถส่งเป็น
    ตำแหน่งที่อยู่ของตัวแปรนั้น ๆ ไปยังฟังก์ชันที่เรียกใช้ได้โดยการอ้างถึง
    ดังนี้

    	:
    	:
    	f1(&sample.x);
    	f2(&sample.y);
    	f3(&sample.z);
    	f4(sample.s);
    	f5(&sample.s[2]);
    	:
    	:

    ข้อสังเกต

    1. เครื่องหมาย & จะอยู่หน้าชื่อ struc-name ไม่ได้อยู่หน้า
      ชื่อตัวแปร
    2. ถ้าเป็นตัวแปรชนิดข้อความ(string) ไม่ต้องใส่เครื่องหมาย &
      เพราะเป็นการส่งค่าตำแหน่งที่อยู่ไปทั้งชุดอยู่แล้ว

  • การส่งตัวแปรชนิดครงสร้างทั้งชุดไปยังฟังก์ชันที่ถูกเรียกใช้
  • 	#include<stdio.h>
    	void main(void)
    	{
    		struct{
    			int	a,b;
    			char	ch;
    			} old;
    		old.a = 500;
    		old.b = 25;
    		old.ch = 'T';
    		f1(old);
    	}
    	f1(new)
    	struct{
    		int 	x, y;
    		char	ch;
    		} new;
    	{
    		printf ("%d \n",new.x);
    		printf ("%d \n",new.y);
    		printf ("%d \n",new.ch);	
    	}

    ผลลัพธ์

    500
    25
    T

    การใช้ตัวแปรพอยน์เตอร์สำหรับตัวแปรชนิดโครงสร้าง (Structure Pointer)

    เราสามารถที่จะใช้พอยเตอร์มาชี้ตำแหน่งที่อยู่ของตัวแปรชนิดโครงสร้าง
    ได้ดังนี้

    	struct point{
    		float 	bal;
    		char	name[80];
    	} person;
    	struct   piont   *p

    คำอธิบาย

    ตัวแปรพอยน์เตอร์ p จะเป็นตัวแปรที่ทำหน้าที่ชี้ตำแหน่งที่อยู่ของตัวแปร
    ชนิดโครงสร้างที่ชื่อ point

    ดังนั้นถ้าต้องการอ้างถึงตัวแปร bal ที่อยู่ในตัวแปรชนิดโครงสร้างที่ชื่อ
    point จะทำได้ดังนี้

    (*p).bal

    ที่ต้องใส่ ( ) ที่ตัวแปรพอยน์เตอร์เพราะเครื่องหมาย . จะมีลำดับการทำงาน
    สูงกว่าเครื่องหมาย *

    ในภาษา C ส่วนใหญ่สามารถใช้เครื่องหมาย -> แทน * ในการใช้ตัวแปร
    พอยน์เตอร์สำหรับอ้างอิงถึงตัวแปรที่อยู่ในตัวแปรชนิดโครงสร้างได้ จะให้
    ความหมายเหมือนกันเช่น

    (*p).bal หรือ p -> bal

    บิตฟิลด์และยูเนี่ยน

    บิตฟิลด์

    ในภาษา C เราสามารถบีบหรืออัด (compress) ข้อมูล เช่น struct date กินเนื้อที่
    6 ไบต์ (2*3) ถ้าเราใช้บิตฟิลต์จะเหลือเพียง 2 ไบต์ เท่านั้น โดยทำดังนี้

    	struct  date {
    		unsigned 	day : 5;
    		unsigned	month : 4;
    		unsigned	year : 7;
    	}

    เนื่องจาก
    dayมีค่ามากที่สุด = 31 = 11111= 5 บิต
    month มีค่ามากที่สุด = 12 = 1100= 4 บิต
    yearมีค่ามากที่สุด = 99 = 1100011= 7 บิต
    16 บิต = 2 ไบต์

    บิตฟิลด์เป็นชนิดไม่มีเครื่องหมาย และไม่มีตำแหน่ง

    ข้อมูลชนิดยูเนี่ยน

    ยูเนี่ยนคล้ายกับโครงสร้าง เป็นวิธีการที่ใช้ในการกำหนดให้เนื้อที่ใน
    หน่วยความจำที่เดียวกัน สามารถเก็บข้อมูลที่ต่างชนิดกันไว้ได้เพื่อ
    ช่วยประหยัดเนื้อที่ภายในหน่วยความจำ

    ตัวอย่าง

    	union same {
    		int 	i;
    		char	ch;
    	};

    คำอธิบาย

    กำหนดให้ตัวแปร i ชนิด int กับตัวแปร ch ชนิด char ใช้ที่ร่วมกัน ใน
    หน่วยความจำ ภายใต้ชื่อตัวแปร same

    ถ้าต้องการให้ตัว x มีข้อมูลเป็นชนิดยูเนี่ยนเหมือนกับ same จะสามารถ
    เขียนคำสั่งได้ดังนี้

    union same x;

    การอ้างถึงข้อมูลที่อยู่ใน Union

    การอ้างถึงข้อมูลที่อยู่ใน union จะทำได้โดยใช้รูปแบบเดียวกับการอ้างถึง
    ข้อมูลที่อยู่ในตัวแปรชนิดโครงสร้าง คือ อ้างถึงชื่อ union ตามด้วย
    เครื่องหมายจุด (.) และชื่อตัวแปรที่อยู่ใน union นั้น ดังนี้

    ตัวอย่าง

    	x.i = 50;
    	x.ch = 'A';

    คำอธิบาย

  • คำสั่งแรกกำหนดให้ตัวแปร i ที่อยู่ใน union x มีค่า 50
  • คำสั่งที่สองจะกำหนดให้ตัวแปร ch ที่อยู่ใน union x มีค่าเป็น
    ตัวอักษร A เข้าไปแทนที่ค่า 50
  • back to main...