Other data types

27 June 2015

ในบทนี้ เราจะแนะนำให้คุณรู้จักกับประเภทข้อมูลชนิดอื่นๆ ที่มีในภาษา 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

บทความนี้เป็นประโยชน์หรือไม่?Yes·No