ตัวแปรและประเภทข้อมูลจะกล่าวถึงข้างต้น ตอนนี้เราจะมาดูกันว่าตัวแปรสามารถจัดหมวดหมู่ตามขอบเขตและการมองเห็นได้อย่างไร
ขอบเขต:โดยทั่วไป ขอบเขตเป็นคำที่บ่งบอกถึงอายุขัยของตัวแปร จะใช้งานได้นานเท่าใดและจะถูกทำลายเมื่อใด
การมองเห็น :การมองเห็นแสดงให้เห็นจากตำแหน่งที่มองเห็นตัวแปร และเราสามารถใช้ตัวแปรได้จากที่ใด ตัวอย่างเช่น หากเราใช้ตัวแปรในเครื่อง เราจะไม่สามารถใช้ตัวแปรจากฟังก์ชันหรือไฟล์อื่นได้ ดังนั้นจะมองเห็นได้เฉพาะภายในบล็อกเท่านั้น
บล็อค :บล็อกถูกกำหนดให้เป็นชุดของเส้นระหว่างวงเล็บปีกกาสองอัน {…} เป็นตัวอย่าง
{
//line1
//line2
//line3
} นี่คือบล็อก
| คลาสการจัดเก็บ | ประกาศอย่างไร | ขอบเขต | การมองเห็น |
|---|---|---|---|
| อัตโนมัติ | ทั่วโลก | | |
| อัตโนมัติ | ในเครื่อง | บล็อก | บล็อค |
| ลงทะเบียน | ทั่วโลก | | |
| ลงทะเบียน | ในเครื่อง | บล็อก | บล็อค |
| คงที่ | ทั่วโลก | โปรแกรม | ไฟล์ |
| คงที่ | ในเครื่อง | โปรแกรม | บล็อค |
| ภายนอก | ทั่วโลก | โปรแกรม | โปรแกรม |
| ภายนอก | ในเครื่อง | โปรแกรม | บล็อค |
ไวยากรณ์พื้นฐานสำหรับคลาสการจัดเก็บ:
<storage class> <datatype> variable_name; ex. static int my_var = 0;
หมายเหตุ:หากเราใช้ like
อัตโนมัติ:คลาสการจัดเก็บอัตโนมัติเป็นคลาสพื้นที่จัดเก็บเริ่มต้นสำหรับตัวแปรในเครื่องทั้งหมด
{
int mount;
auto int month;
} ตัวอย่างข้างต้นกำหนดตัวแปรสองตัวในคลาสการจัดเก็บเดียวกัน 'auto' ใช้ได้เฉพาะในฟังก์ชัน เช่น ตัวแปรในเครื่อง
ลงทะเบียน :register storage class ใช้เพื่อกำหนดตัวแปรในเครื่องที่ควรเก็บไว้ใน register แทนที่จะเป็น RAM ซึ่งหมายความว่าตัวแปรมีขนาดสูงสุดเท่ากับขนาดรีจิสเตอร์ (โดยปกติคือหนึ่งคำ) และไม่สามารถใช้โอเปอเรเตอร์ '&' ร่วมกันได้ (เนื่องจากไม่มีตำแหน่งหน่วยความจำ)
{
register int miles;
} การลงทะเบียนควรใช้เฉพาะกับตัวแปรที่ต้องการการเข้าถึงอย่างรวดเร็ว เช่น ตัวนับ ควรสังเกตด้วยว่าการกำหนด 'การลงทะเบียน' ไม่ได้หมายความว่าตัวแปรจะถูกเก็บไว้ในการลงทะเบียน หมายความว่าอาจถูกเก็บไว้ในรีจิสเตอร์ขึ้นอยู่กับข้อจำกัดของฮาร์ดแวร์และการใช้งาน
คงที่ :คงที่ คลาสสตอเรจสั่งให้คอมไพเลอร์เก็บตัวแปรโลคัลไว้ตลอดช่วงอายุของโปรแกรม แทนที่จะสร้างและทำลายมันทุกครั้งที่เข้ามาและนอกขอบเขต ดังนั้น การทำให้ตัวแปรโลคัลคงที่ทำให้สามารถรักษาค่าระหว่างการเรียกใช้ฟังก์ชันได้
ตัวแก้ไขแบบคงที่อาจนำไปใช้กับตัวแปรส่วนกลางได้ เมื่อเสร็จสิ้น จะทำให้ขอบเขตของตัวแปรถูกจำกัดเฉพาะไฟล์ที่ประกาศ
ในการเขียนโปรแกรม C เมื่อใช้สแตติกกับตัวแปรโกลบอล จะทำให้อ็อบเจ็กต์ทั้งหมดในคลาสเดียวกันใช้สำเนาเดียวของสมาชิกนั้นร่วมกัน
โค้ดตัวอย่าง
#include <stdio.h>
/* function declaration */
void func(void);
static int count = 5; /* global variable */
main() {
while(count--) {
func();
}
return 0;
}
/* function definition */
void func( void ) {
static int i = 5; /* local static variable */
i++;
printf("i is %d and count is %d\n", i, count);
} ผลลัพธ์
i is 6 and count is 4 i is 7 and count is 3 i is 8 and count is 2 i is 9 and count is 1 i is 10 and count is 0
ภายนอก :คลาสการจัดเก็บข้อมูลภายนอกใช้เพื่ออ้างอิงตัวแปรโกลบอลที่ไฟล์โปรแกรมทั้งหมดมองเห็นได้ เมื่อคุณใช้ 'extern' ตัวแปรจะไม่สามารถเริ่มต้นได้ แต่จะชี้ชื่อตัวแปรไปที่ตำแหน่งการจัดเก็บที่กำหนดไว้ก่อนหน้านี้
เมื่อคุณมีหลายไฟล์และคุณกำหนดตัวแปรส่วนกลางหรือฟังก์ชัน ซึ่งจะใช้ในไฟล์อื่นด้วย จากนั้น extern จะถูกใช้ในไฟล์อื่นเพื่อให้การอ้างอิงของตัวแปรหรือฟังก์ชันที่กำหนดไว้ เพื่อความเข้าใจ extern ใช้เพื่อประกาศตัวแปรส่วนกลางหรือฟังก์ชันในไฟล์อื่น
ตัวแก้ไขภายนอกมักใช้เมื่อมีไฟล์สองไฟล์ขึ้นไปที่แชร์ตัวแปรส่วนกลางหรือฟังก์ชันเดียวกันดังที่อธิบายไว้ด้านล่าง
โค้ดตัวอย่าง (main.c):
#include <stdio.h>
int count ;
extern void write_extern();
main() {
count = 5;
write_extern();
}
Example Code (support.c):
#include <stdio.h>
extern int count;
void write_extern(void) {
printf("count is %d\n", count);
} ผลลัพธ์
count is 5