ในบทนี้ เราจะแนะนำให้นักเรียนรู้จักกับประเภทข้อมูลชนิดอื่นๆ ที่มีในภาษา C เช่น typedef และ enum อย่างไรก็ตาม ยังมีประเภทข้อมูลอื่นอีกที่อาจจะไม่ได้กล่าวถึงในบทเรียนนี้ แต่นี่จะเป็นที่จำเป็นที่นักเรียนจะต้องรู้จักในการที่จะเรียนรู้ภาษา C
Type aliases (typedef) #
การใช้คำสั่ง typedef
สามารถให้เราประกาศประเภทของข้อมูลใหม่ตามที่ต้องการได้ โดยมันมีรูปแบบการใช้งานดังนี้
typedef data_type identify;
typedef
เป็นคำสั่งที่ใช้ในการประกาศ data_type
เป็นประเภทของข้อมูลเดิมที่มีอยู่แล้ว และ identify
เป็นชื่อของชนิดข้อมูลใหม่ของเรา มาดูตัวอย่าง
typedef int myType;
myType a, b;
a = 5;
b = 4;
ในตัวอย่าง เราได้สร้างประเภทข้อมูลใหม่ขึ้นมาชื่อว่า myType
โดยมีประเภทข้อมูลเป็น int ในตอนนี้เราสามารถใช้ myType ในการสร้างตัวแปรหรือทำอย่างอื่นได้ เหมือนที่ใช้ประกาศตัวแปร a และ b ในตัวอย่าง นอกจากนี้มันยังสามารถใช้ได้กับ data structure ด้วย เช่น
typedef struct person myStruct;
myStruct student; // มีค่าเหมือน struct person student;
ตัวอย่างด้านบนอ้างอิงจากบทเรียนก่อนหน้า ต่อไปมาดูตัวอย่างการใช้งานคำสั่ง typedef สำหรับประกาศประเภทข้อมูลแบบเสมือนในภาษา C ซึ่งเราจะสร้างข้อมูลสองประเภทใหม่ขึ้นมาคือ boolean และ string
#include <stdio.h>
int main()
{
typedef int boolean;
typedef char* string;
string name = "Mateo";
string site_name = "marcuscode.com";
boolean is_love = 1;
printf("%s is reading C tutorial on %s.\n", name, site_name);
if (is_love)
{
printf("He loves to learn C language.\n");
}
return 0;
}
ในตัวอย่าง เราใช้คำสั่ง typedef ในการสร้าง type alias ของ int เป็น boolean
ซึ่งคือค่าที่เก็บได้เพียงสองค่าคือ 1 และ 0 และอีกคำสั่งหนึ่งเป็นการสร้างอาเรย์ของ char โดยกำหนดเป็น string
ซึ่งเมื่อเราใช้ประเภทข้อมูลนี้ เราจะสามารถเก็บข้อมูลได้หลายตัวอักษร ซึ่งข้อมูลสองประเภทนี้ไม่มีในภาษา C แต่จะมีในภาษาระดับสูงขึ้นไปเช่น C++ และ Java ดังนั้นในการที่เราสร้าง type alias จะช่วยอำนวยความสะดวกให้โค้ดของเราเข้าใจได้ง่ายกว่า
Mateo is reading C tutorial on marcuscode.com.
He loves to learn C language.
นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการใช้คำสั่ง typedef เพื่อกำหนดชื่อของประเภทข้อมูลใหม่ในภาษา C
Enumerated types (enum) #
ประเภทข้อมูลอีกแบบหนึ่งที่น่าสนใจคือประเภทข้อมูลแบบ enum ซึ่งเป็นข้อมูลแทนจำนวนเต็มที่แสดงใน String literal โดยค่าของมันสามารถเป็นข้อมูลประเภทไหนก็ได้ ที่ไม่ใช้ Keyword ในภาษา C มันมีรูปแบบดังนี้:
enum type_name
{
value1, value2, value3, ...
} object_names;
คำสั่ง enum
ใช้สำหรับการสร้าง และตามด้วย type_name
ชื่อของ enum และในวงเล็บ {}
เป็นการกำหนดค่าให้กับตัวแปร enum ซึ่งเป็นตัวอักษรใดๆ ที่ยังไม่ได้มีอยู่หรือเป็น keyword ในภาษา C มาดูตัวอย่างการสร้างและใช้งาน
#include <stdio.h>
enum day_m
{
sunday, monday, tuesday, wednesday, thursday, friday, saturday
};
int main()
{
enum day_m myDay;
myDay = monday;
if (myDay == monday) {
myDay = tuesday;
}
else {
myDay = sunday;
}
printf("Enum value is %d\n", myDay);
return 0;
}
ในตัวอย่างเราได้สร้างตัวแปร enum day_m
ขึ้นมาและใช้สร้างตัวแปร myDay
เพื่อที่จะให้เป็นประเภทข้อมูลของมันโดยคำสั่ง day_m myDay;
ดังนั้น ประเภทข้อมูลที่ถูกต้องของ myDay จะเป็น sunday, monday, thuesday, …
โดยปกติแล้ว ค่าของข้อมูลใน enum ให้ถูกแปลงค่าให้เป็น integer โดยปริยาย โดยมันจะมีค่าเริ่มต้นจาก 0, 1, 2, … ดังนั้น sunday นั้นเท่ากับ 0, monday เป็น 1, tuesday เป็น 2, ตามลำดับ
myDay = tuesday;
if (myDay == 2)
{
printf("myDay is Tuesday");
}
ต่อไปมาดูตัวอย่างการใช้งาน enum ในภาษา C
#include <stdio.h>
enum continent {
north_america, south_america, antarctica, europe, asia, africa, australia
};
int main()
{
enum continent myContinent;
myContinent = north_america;
printf("Continent %d\n", myContinent);
printf("Continent %d\n", myContinent + 1);
myContinent = australia;
printf("Continent %d\n", myContinent);
return 0;
}
ในตัวอย่าง เราได้ประกาศ enum สำหรับ 7 ทวีปในโลกโดยกำหนดชื่อของทวีปต่างๆ ลงในตัวแปร enum continent
โดยที่ north_america
จะมีค่าเป็น 0 south_america
จะมีค่าเป็น 1 และจะเพิ่มค่าไปเรื่อยๆ จนถึง australia
ซึ่งมีค่าเป็น 6
enum continent myContinent;
myContinent = north_america;
ต่อมาเป็นการใช้งาน enum โดยการประกาศตัวแปร enum myContinent
ตัวแปรนี้สามารถเก็บค่าใดๆ ที่เป็นประเภทของ continent
และสามารถใช้ได้เหมือนกับข้อมูลประเภท Integer
Continent 0
Continent 1
Continent 6
นี่เป็นผลลัพธ์การทำงานของโปรแกรม ซึ่งค่าที่แสดงออกมานั้นเป็น Integer ตามลำดับของทวีปต่างๆ
ในภาษา C นั้นเราสามารถกำหนดค่าให้กับ enum เองได้ด้วย โดยค่าที่กำหนดให้กับ enum นั้นจะต้องเป็นจำนวนเต็มใดๆ มาดูตัวอย่างการใช้งาน enum แบบค่ากำหนดเอง
#include <stdio.h>
enum ocean
{
arctic = 0,
atlantic = 1,
indian = 10,
pacific = 50,
southern = -1
};
int main()
{
enum ocean oc;
oc = indian;
printf("Ocean %d\n", oc);
oc = southern;
printf("Ocean %d\n", oc);
return 0;
}
ในตัวอย่าง เราได้ประกาศตัวแปร enum ของ 5 มหาสมุทรของโลก และในตอนนี้เราได้กำหนดค่าให้กับค่าของ enum ซึ่งเป็นได้ทั้งจำนวนเต็มบวกและจำนวนเต็มลบ และใช้งานเหมือนตัวแปร enum ปกติ
Ocean 10
Ocean -1
นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการใช้งาน enum แบบกำหนดค่าเอง
Union (ยูเนี่ยน) #
Union เป็นประเภทข้อมูลแบบโครงสร้างข้อมูลเหมือน struct ที่สามารถเก็บข้อมูลต่างๆ ประเภทกันได้ที่หน่วยความจำเดียวกัน union จะประกอบไปด้วยสมาชิกประเภทต่างๆ และสิ่งที่แตกต่างจาก struct คือ union สามารถเก็บข้อมูลได้เพียงหนึ่งค่าสำหรับสมาชิกใดๆ ในขณะที่ struct นั้นจะสามารถเก็บข้อมูลได้พร้อมกันหมด ทำให้ขนาดของ union นั้นมีขนาดเท่ากับสมาชิกที่ใช้หน่วยความจำมากที่สุด นี่เป็นตัวอย่างการประกาศ union ในภาษา C
union person {
char name[20];
float salary;
int age;
};
ในตัวอย่าง เราได้ประก่ศ union ด้วยคำสั่ง union
และตามด้วยชื่อของมัน ภายในบล็อคของ union นั้นจะเป็นสมาชิกของมันจาก primitive data type ใดๆ ต่อมาดูตัวอย่างการใช้งาน union ในภาษา C
#include <stdio.h>
#include <string.h>
union person {
char name[20];
float salary;
int age;
};
int main() {
union person person1;
strcpy(person1.name, "Thomas");
person1.salary = 43000;
person1.age = 24;
printf("Name: %s\n", person1.name);
printf("Salary: %f\n", person1.salary);
printf("Age: %d\n", person1.age);
person1.salary = 48000;
printf("Name: %s\n", person1.name);
printf("Salary: %f\n", person1.salary);
printf("Age: %d\n", person1.age);
printf("\nSize of union %d\n", sizeof(person1));
return 0;
}
ในตัวอย่าง เราได้สร้างตัวแปร union person1
และกำหนดค่าให้กลับสมาชิกภายใน union ในการเข้าถึงสมาชิกของ union นั้นจะใช้เครื่องหมายจุด (.) เช่นเดียวกับ struct ในตอนแรกเรากำหนดค่าให้กับทุกสมาชิกของตัวแปร union ซึ่งในการกำหนดค่าให้กับ union นั้นมันสามารถเก็บค่าได้เพียงทีละสมาชิกเท่านั้น เพราะว่าทุกตัวแปรใช้หน่วยความจำความร่วมกัน
strcpy(person1.name, "Thomas");
person1.salary = 43000;
person1.age = 24;
เมื่อสิ้นสุดทั้งสามคำสั่งนี้ ทำให้ค่าของสมาชิก union นั้นมีเพียง age
เท่านั้นที่มีค่า สำหรับตัวแปร name
และ salary
นั้นจะหลายเป็นค่า null แทน
person1.salary = 48000;
และหลังจากนั้นเรากำหนดค่าให้กับตัวแปร salary
จึงทำให้ตัวแปรอื่นสองตัวแปรนั้นมีค่าเป็น null
Name: ↑
Salary: 0.000000
Age: 24
Name:
Salary: 48000.000000
Age: 1195081728
นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการใช้งาน union ในภาษา C ซึ่งนักเรียนจะเห็นว่าจะเป็นข้อมูลที่ถูกต้องเพียงตัวแปรสุดท้ายก่อนที่เราจะแสดงผล
ในบทนี้ นักเรียนได้เรียนรู้เกี่ยวกับการสร้างและใช้งานประเภทข้อมูลแบบ typedef สำหรับการกำหนดประเภทข้อมูลเสมือนเพื่อนำไปใช้ในการสร้างตัวแปร enum ที่เป็นข้อมูลในการกำหนดค่าของตัวแปรในมีความหมายโดยการใช้ Literal ของ string และ union ประเภทข้อมูลที่สามารถเก็บค่าได้เพียงทีละค่าเพราะใช้หน่วยความจำของสมาชิกร่วมกัน ในภาษา C