[ภาษาซี] 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 มันมีน้อย ดังนั้นการใช้งานก็ควรใช้เท่าที่จําเป็นเท่านั้น

Suggestion blogs

ทดสอบประสิทธิภาพของ web server ด้วย Apache Benchmark (Ab)

เมื่อเราพัฒนา web site หนึ่งขึ้นมา เราจะรู้ได้อย่างไรว่าเว็บเรามีความเร็วในการทํางานมากน้อยแค่ไหน หรือแม้กระทั่ง Server ของเราทํางานได้ดีแค่ไหน สามารถรองรับ user ได้เท่าไร โดยปกติเมื่อเราติดตั้ง Apache จะมี tool ตัวนึงชื่อว่า ab (Apache Benchmark) ติดมาด้วย ซึ่ง tool ตัวนี้สามารถจําลองการเรียกใช้งานเว็บตาม path ที่เราระบุ

[ภาษาซี] ค่าคงที่ Constant

ค่าคงที่แบ่งออกเป็น 3 ประเภท คือ

[ภาษาซี] ลําดับการทํางานของโอเปอเรเตอร์

โอเปอเรเตอร์มีอยู่หลายชนิด ดังนั้นภาษาซีจึงได้กําหนดลําดับความสําคัญของของโอเปอเรเตอร์ขึ้นมา โดยเรียงลําดับจากความสําคัญสูงไปความสําคัญตํ่า ดังนี้


Copyright © 2019 - 2025 thiti.dev |  v1.45.0 |  Privacy policy | 

Build with ❤️ and Astro.

Github profile   Linkedin profile   Instagram   X profile   Nostr   Youtube channel   Telegram   Email contact   วงแหวนเว็บ