[ภาษาซี] Storage Class

4 Jan 2018

Share to:

Storage Class คือ สิ่งที่ใช้กําหนดขอบเขตของตัวแปรว่าจะให้ใครสามารถเข้ามาเรียกใช้งานได้บ้าง และยังสามารถกําหนดระยะเวลาว่าจะให้โปรแกรมเก็บค่าของตัวแปรนั้นไว้นานเท่าไรได้ด้วย Storage Class แบ่งออกเป็น 4 ประเภท คือ

  • auto
  • extern
  • static
  • register

auto

เป็นการประกาศ automatic variable หรือก็คือ ตัวแปรแบบโลคอลนั่นเอง ตัวแปรประเภทนี้เป็นตัวแปรทั่วไปที่ประกาศขึ้นใช้งาน เช่น

int number;
char str;

โดยปกติเมื่อประกาศตัวแปรขึ้นมาดังตัวอย่าง ตัวแปรนั้นจะเป็นตัวแปรแบบ automatic variable อยู่แล้ว ไม่ต้องระบุอะไรเพิ่มเติม ซึ่งจะมีเฉพาะ function ที่สร้างตัวแปรนั้นขึ้นมาเท่านั้นที่จะสามารถใช้งานตัวแปรนั้นได้ และตัวแปรนั้นจะถูกทําลายเมื่อ function นั้นทํางานเสร็จ จึงเป็นเหตุให้ function อื่นๆไม่สามารถเรียกใช้ตัวแปลดังกล่าวได้

extern

extern variable เป็นตัวแปรแบบโกลบอลที่ทุก function สามารถมองเห็น และเรียกใช้งานได้ แต่จะถูกประกาศไว้ที่ไฟล์อื่นๆ โดยระบุ extern ไว้หน้าตัวแปรเพื่อทําการอ้างอิงไปยังตัวแปรนั้นๆในไฟล์อื่น ตัวอย่าง ไฟล์ print.c

#include <stdio.h>

extern int num;
void print(){
    printf("Number is %d\n", num);
}

ไฟล์ testPrint.c

#include <stdio.h>
#include "print.c"

int num = 9;
main(){
    print();
}

จะเห็นว่าในไฟล์ print.c ประกาศตัวแปร num เป็นแบบ extern และในไฟล์ testPrint.c มีการกําหนดค่าให้กับตัวแปร num เมื่อเรียก function print(); โปรแกรมจะ print เลข 9 ออกมา

static

ตัวแปรแบบ static variable เป็นตัวแปรที่ประกาศแบบโลคอล หรือโกลบอล ก็ได้ static variable จะถูกสร้าง เมื่อโปรแกรมเริ่มทํางาน และจะถูกทําลายเมื่อโปรแกรมจบการทํางาน(จบการทํางานของโปรแกรม ไม่ใช้จบการทํางานของ function) ดังนั้นเมื่อโปรแกรมกลับมาทํางาน function เดิมอีกครั้งค่าของตัวแปรก็ยังคงอยุ่(หมายถึงเป็นค่าล่าสุด กลังจากเรียก function นั้นครั้งสุดท้าย) ตัวอย่าง ไฟล์ printVar.c

#include <stdio.h>

extern int num;
void printVar(){
    auto int a = 0;
    static int b = 0;

    a++;
    b++;

    print("a = %d b = %d\n", a, b);
}

ไฟล์ testVar.c

#include <stdio.h>
#include "printVar.c"

main(){
    int i;
    for(i=0;i<5;i++){
        printVar();
    }
}

ผลลัพธ์ของโปรแกรม

a = 1 b = 1
a = 1 b = 2
a = 1 b = 3
a = 1 b = 4
a = 1 b = 5

จะเห็นว่า ตัวแปร a ที่เป็น แบบ automatic variable จะได้ค่าเริ่มต้นทุกครั้งที่เรียก function แต่ ตัวแปร b ซึ่งเป็นตัวแปบแบบ static variable จะถูกเพิ่มค่าขึ้นไปเรื่อยๆในทุกๆครั้งที่เรียก function

register

ปกติแล้วเมื่อเราประกาศตัวแปรขึ้นใช้งานระบบจะเก็บข้อมูลไว้ใน ram แต่ตัวแปรแบบ register variable เป็นตัวแปรที่จะเก็บข้อมูลใน register บน CPU ข้อดีมันจะทํางานเร็วมากกว่าเก็บบน ram

ถ้าประกาศตัวแปรประเภทนี้มากเกินไปอาจจะทําให้ register เต็มได้เนื่องจาก register มันมีน้อย ดังนั้นการใช้งานก็ควรใช้เท่าที่จําเป็นเท่านั้น


Copyright © 2019 - 2024 thiti.dev |  v1.19.0 |  Privacy policy |  status | 

            วงแหวนเว็บ