[ภาษาซี] Storage Class

4 Jan 2018,
Share: 

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

swap memory ใน ubuntu

swap คือ file ประเภทหนึ่งที่ทําหน้าที่คลาย ram โดยจะต่างจาก ram ตรงที่ เป็นไฟล์ที่ถูกเขียนบน HDD ซึ่งจะมีความเร็วน้อยกว่า ram ในกรณีที่ ram ไม่พอ เราสามารถสร้าง swap มาใช้เป็น ram สํารองได้

Arduino ตอน9 วิธีใช้ Analog output (PWM) ใน arduino

สวัสดีครับ วันนี้เราจะมาเรียนรู้การใช้งาน Analog output หรือ PWM ใน Arduino กันครับ โดยปกติแล้ว Arduino จะทํางานกับข้อมูลหรือ I/O ที่เป็นแบบ Digital HIGH/LOW (0V/5V) แต่ในบางกรณีเราอาจจําเป็นต้องใช้งาน I/O ที่เป็นแบบ Analog (0v, 1V, 2V...5V) เพื่อใช้ควบคุมอุปกรณ์ที่เป็นแบบ Analog เช่น ความสว่างของหลอดไฟ, ควบคุมความเร็วของ Motor ฯลฯ

การใช้งานคําสั่ง git config

สวัสดีครับ ก่อนที่เราจะใช้งาน Git นั้นเราจําเป็นจะต้อง Config ข้อมูลเบื่องต้นก่อนครับ เช่น Name, Email ซึ่งข้อมูลพวกนี้จะเอาไปใช้ตอนที่เรา Commit ครับ จะเป็นข้อมูลที่บอกว่าใครเป็นคน Commit นั้นเอง


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

Build with ❤️ and Astro.

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