คลาสพื้นที่เก็บข้อมูลใน C: อัตโนมัติ, ภายนอก, คงที่, รีจิสเตอร์ (ตัวอย่าง)

⚡ สรุปอย่างชาญฉลาด

คลาสการจัดเก็บข้อมูลในภาษา C กำหนดขอบเขต อายุการใช้งาน ค่าเริ่มต้น และตำแหน่งหน่วยความจำของตัวแปรทุกตัว โดยใช้ตัวระบุสี่แบบ ได้แก่ auto, register, static และ extern เพื่อควบคุมว่าข้อมูลจะอยู่ที่ใดและคงอยู่ได้นานแค่ไหนในระหว่างการประมวลผล

  • 🗂️ สี่ประเภทการจัดเก็บข้อมูล: ภาษา C มีตัวระบุประเภทตัวแปรแบบ auto, register, static และ extern เพื่อใช้อธิบายตัวแปรทุกตัว
  • 🏠 อัตโนมัติ: คลาสโลคอลเริ่มต้น ซึ่งจำกัดอยู่ภายในบล็อกของมัน และเก็บค่าที่ไม่แน่นอนจนกว่าจะมีการกำหนดค่าให้
  • ลงทะเบียน: ร้องขอพื้นที่จัดเก็บข้อมูลในรีจิสเตอร์ของซีพียูเพื่อการเข้าถึงตัวแปรที่ใช้บ่อย เช่น ตัวนับ ได้เร็วขึ้น
  • ♻️ คงที่: รักษาค่าตัวแปรไว้ระหว่างการเรียกใช้ฟังก์ชัน และค่าเริ่มต้นจะเป็นศูนย์ในการใช้งานครั้งแรก
  • 🌐 ภายนอก: แชร์ตัวแปรหรือฟังก์ชันส่วนกลางระหว่างไฟล์ต้นฉบับหลายไฟล์โดยไม่ต้องกำหนดค่าใหม่
  • 📊 ขอบเขตและอายุการใช้งาน: แต่ละคลาสจะกำหนดว่าตัวแปรนั้นสามารถมองเห็นได้ที่ใดและมีอายุการใช้งานนานเท่าใด

คลาสการจัดเก็บในC

Storage Class ใน C คืออะไร?

คลาสการจัดเก็บข้อมูลแสดงถึงการมองเห็นและตำแหน่งของตัวแปร คลาสนี้จะบอกให้เราทราบว่าเราสามารถเข้าถึงตัวแปรได้จากส่วนใดของโค้ด คลาสการจัดเก็บข้อมูลใน C ใช้เพื่ออธิบายสิ่งต่อไปนี้:

  • ขอบเขตตัวแปร
  • ตำแหน่งที่จะจัดเก็บตัวแปร
  • ค่าเริ่มต้นของตัวแปร
  • อายุการใช้งานของตัวแปร
  • ใครสามารถเข้าถึงตัวแปรได้บ้าง?

ดังนั้นคลาสการจัดเก็บข้อมูลจึงถูกใช้เพื่อแสดงข้อมูลเกี่ยวกับตัวแปร

หมายเหตุ: ตัวแปรไม่ได้เกี่ยวข้องกับเพียงแค่ ประเภทข้อมูลค่าของมัน แต่ยังเป็นคลาสการจัดเก็บข้อมูลด้วย

ประเภทของคลาสการจัดเก็บข้อมูลในภาษา C คืออะไร?

คลาสพื้นที่จัดเก็บข้อมูลมาตรฐานมีทั้งหมดสี่ประเภท ตารางด้านล่างแสดงถึงคลาสการจัดเก็บข้อมูลในภาษาซี

ชั้นเก็บของ จุดมุ่งหมาย
รถยนต์ เป็นคลาสการจัดเก็บข้อมูลเริ่มต้น
extern มันเป็นตัวแปรระดับโลก
คงที่ เป็นตัวแปรท้องถิ่นซึ่งสามารถส่งกลับค่าได้แม้ว่าการควบคุมจะถูกโอนไปยังการเรียกใช้ฟังก์ชันก็ตาม
ทะเบียน เป็นตัวแปรที่เก็บไว้ในรีจิสเตอร์

คลาสการจัดเก็บอัตโนมัติใน C

ตัวแปรที่กำหนดโดยใช้คลาสการจัดเก็บข้อมูลอัตโนมัติเรียกว่าเป็นตัวแปรภายในเครื่อง Auto ย่อมาจากคลาสการจัดเก็บอัตโนมัติ ตัวแปรอยู่ในคลาสพื้นที่จัดเก็บอัตโนมัติตามค่าเริ่มต้น หากไม่ได้ระบุไว้อย่างชัดเจน

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

คำหลัก auto ใช้เพื่อกำหนดคลาสการจัดเก็บข้อมูลอัตโนมัติ ตามค่าเริ่มต้น ตัวแปรอัตโนมัติมีค่าขยะ

Example, auto int age;

โปรแกรมด้านล่างกำหนดฟังก์ชันที่มีตัวแปรท้องถิ่นสองตัว

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

เราใช้โปรแกรมอื่นที่แสดงระดับขอบเขต "ระดับการมองเห็น" สำหรับตัวแปรอัตโนมัติในแต่ละรหัสบล็อกซึ่งแยกจากกัน:

#include <stdio.h>
int main( )
{
  auto int j = 1;
  {
    auto int j= 2;
    {
      auto int j = 3;
      printf ( " %d ", j);
    }
    printf ( "\t %d ",j);
  }
  printf( "%d\n", j);}

Output:

 3 2 1

คลาสการจัดเก็บข้อมูลภายนอกใน C

Extern ย่อมาจากคลาสการจัดเก็บข้อมูลภายนอก คลาสการจัดเก็บข้อมูลภายนอกถูกใช้เมื่อเรามีฟังก์ชันโกลบอลหรือตัวแปรที่แชร์ระหว่างไฟล์ตั้งแต่สองไฟล์ขึ้นไป

คีย์เวิร์ด extern ใช้สำหรับประกาศตัวแปรหรือฟังก์ชันส่วนกลางในไฟล์อื่น เพื่อให้สามารถอ้างอิงถึงตัวแปรหรือฟังก์ชันที่ได้กำหนดไว้แล้วในไฟล์ต้นฉบับ

ตัวแปรที่กำหนดโดยใช้คำสำคัญภายนอกเรียกว่าตัวแปรร่วม ตัวแปรเหล่านี้สามารถเข้าถึงได้ตลอดทั้งโปรแกรม โปรดสังเกตว่าตัวแปรภายนอกไม่สามารถเริ่มต้นได้เนื่องจากได้ถูกกำหนดไว้ในไฟล์ต้นฉบับแล้ว

Example, extern void display();

ไฟล์แรก: main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

ไฟล์ที่สอง: original.c

#include <stdio.h>
i=48;

ผลลัพธ์:

 value of the external integer is = 48

เพื่อคอมไพล์และรันโค้ดข้างต้น ให้ทำตามขั้นตอนด้านล่าง

ขั้นตอนที่ 1) สร้างโปรเจ็กต์ใหม่

  • เลือกแอปพลิเคชันคอนโซล
  • ClickGo

สร้างโปรเจ็กต์ใหม่ใน Code Blocks

ขั้นตอนที่ 2) เลือก C แล้วคลิกถัดไป

เลือกภาษา C

ขั้นตอนที่ 3) คลิกถัดไป

คลิกถัดไป

ขั้นตอนที่ 4) กรอกรายละเอียดแล้วคลิก ถัดไป

ป้อนรายละเอียดโครงการ

ขั้นตอนที่ 5) คลิก เสร็จสิ้น

คลิกเสร็จสิ้น

ขั้นตอนที่ 6) นำโค้ดหลักตามที่แสดงในโปรแกรมก่อนหน้าใส่ลงในไฟล์ main.c แล้วบันทึก

เพิ่มโค้ดลงใน main.c

ขั้นตอนที่ 7) สร้างไฟล์ C ใหม่ [ไฟล์ -> ใหม่ -> ไฟล์เปล่า] บันทึก (เป็น original.c) และเพิ่มลงในโปรเจ็กต์ปัจจุบันโดยคลิก “ตกลง” ในกล่องโต้ตอบ

สร้างไฟล์ original.c

ขั้นตอนที่ 8) นำโค้ดภาษา C ของไฟล์ original.c ที่แสดงในตัวอย่างก่อนหน้านี้มาบันทึก โดยไม่ต้องมีฟังก์ชัน main()

เพิ่มโค้ดลงในไฟล์ original.c

ขั้นตอนที่ 9) สร้างและเรียกใช้โปรเจ็กต์ของคุณ ผลลัพธ์จะแสดงในรูปถัดไป

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

คลาสการจัดเก็บแบบคงที่ใน C

ตัวแปรคงที่ถูกใช้ภายในฟังก์ชัน/ ไฟล์เป็นตัวแปรคงที่ในเครื่อง พวกเขายังสามารถใช้เป็น ตัวแปรส่วนกลาง

  • ตัวแปรท้องถิ่นแบบคงที่คือตัวแปรท้องถิ่นที่รักษาและจัดเก็บค่าของมันระหว่างการเรียกใช้ฟังก์ชันหรือบล็อก และยังคงมองเห็นได้เฉพาะกับฟังก์ชันหรือบล็อกที่กำหนดไว้เท่านั้น
  • ตัวแปรส่วนกลางแบบสแตติก คือตัวแปรส่วนกลางที่มองเห็นได้เฉพาะในไฟล์ที่ประกาศตัวแปรนั้นเท่านั้น
Example: static int count = 10;

โปรดทราบว่าตัวแปรคงที่มีค่าเริ่มต้นเป็นศูนย์และจะเริ่มต้นได้เพียงครั้งเดียวตลอดอายุการใช้งาน

#include <stdio.h> /* function declaration */
void next(void);
static int counter = 7; /* global variable */
main() {
 while(counter<10) {
      next();
      counter++;   }
return 0;}
void next( void ) {    /* function definition */
   static int iteration = 13; /* local static variable */
   iteration ++;
   printf("iteration=%d and counter= %d\n", iteration, counter);}

ผลลัพธ์:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

ตัวแปรส่วนกลางสามารถเข้าถึงได้ทั่วทั้งไฟล์ ในขณะที่ตัวแปรแบบคงที่สามารถเข้าถึงได้เฉพาะบางส่วนของโค้ดเท่านั้น

อายุการใช้งานของตัวแปรคงที่จะอยู่ในโค้ดโปรแกรมทั้งหมด ตัวแปรที่ถูกประกาศหรือเริ่มต้นโดยใช้คีย์เวิร์ดแบบคงที่จะมีศูนย์เป็นค่าเริ่มต้นเสมอ

ลงทะเบียนคลาสการจัดเก็บใน C

คุณสามารถใช้คลาสหน่วยเก็บข้อมูลรีจิสเตอร์เมื่อคุณต้องการจัดเก็บตัวแปรโลคัลภายในฟังก์ชันหรือบล็อกในรีจิสเตอร์ CPU แทน แรม เพื่อให้เข้าถึงตัวแปรเหล่านี้ได้อย่างรวดเร็ว ตัวอย่างเช่น "ตัวนับ" เป็นตัวเลือกที่ดีที่จะจัดเก็บไว้ในทะเบียน

Example: register int age;

คำหลัก `register` ใช้สำหรับประกาศคลาสเก็บข้อมูลแบบรีจิสเตอร์ ตัวแปรที่ประกาศโดยใช้คลาสเก็บข้อมูลแบบรีจิสเตอร์จะมีอายุการใช้งานตลอดทั้งโปรแกรม

คล้ายกับคลาสจัดเก็บข้อมูลอัตโนมัติ ตัวแปรถูกจำกัดไว้ที่บล็อกเฉพาะ ข้อแตกต่างเพียงอย่างเดียวคือตัวแปรที่ประกาศโดยใช้คลาสหน่วยเก็บข้อมูลรีจิสเตอร์จะถูกจัดเก็บไว้ในรีจิสเตอร์ CPU แทนที่จะเป็นหน่วยความจำ Register มีการเข้าถึงได้เร็วกว่าหน่วยความจำหลัก

ตัวแปรที่ประกาศโดยใช้คลาสหน่วยเก็บข้อมูลรีจิสเตอร์ไม่มีค่าเริ่มต้น ตัวแปรเหล่านี้มักถูกประกาศไว้ที่จุดเริ่มต้นของโปรแกรม

#include <stdio.h> /* function declaration */
main() {
{register int  weight;
int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/}
}

Output:

error: address of register variable 'weight' requested

ตารางต่อไปนี้จะสรุปคุณลักษณะหลักของแต่ละคลาสการจัดเก็บข้อมูลซึ่งมักใช้ในการเขียนโปรแกรม C

ชั้นเก็บข้อมูล การประกาศ พื้นที่จัดเก็บ ค่าเริ่มต้นเริ่มต้น ขอบเขต ตลอดชีวิต
รถยนต์ ภายในฟังก์ชัน/บล็อก หน่วยความจำ ทายไม่ถูก ภายในฟังก์ชัน/บล็อก ภายในฟังก์ชัน/บล็อก
ทะเบียน ภายในฟังก์ชัน/บล็อก การลงทะเบียน CPU ขยะ ภายในฟังก์ชัน/บล็อก ภายในฟังก์ชัน/บล็อก
extern นอกเหนือฟังก์ชั่นทั้งหมด หน่วยความจำ ศูนย์ ไฟล์ทั้งหมดและไฟล์อื่นๆ ที่ตัวแปรถูกประกาศเป็นไฟล์ภายนอก รันไทม์ของโปรแกรม
คงที่ (ท้องถิ่น) ภายในฟังก์ชัน/บล็อก หน่วยความจำ ศูนย์ ภายในฟังก์ชัน/บล็อก รันไทม์ของโปรแกรม
คงที่ (ทั่วโลก) นอกเหนือฟังก์ชั่นทั้งหมด หน่วยความจำ ศูนย์ เหตุการณ์ที่ รันไทม์ของโปรแกรม

คำถามที่พบบ่อย

ขอบเขต (Scope) กำหนดว่าตัวแปรนั้นสามารถมองเห็นได้ที่ใดในโค้ด ในขณะที่อายุการใช้งาน (Lifetime) กำหนดว่าตัวแปรนั้นจะคงอยู่ในหน่วยความจำนานแค่ไหน ตัวแปรอาจมีขอบเขตเฉพาะบล็อก แต่มีอายุการใช้งานตลอดทั้งโปรแกรม

ทั้งสองวิธีสร้างตัวแปรโลคอลที่มีขอบเขตบล็อก แต่แบบอัตโนมัติจะเก็บตัวแปรเหล่านั้นไว้ในหน่วยความจำโดยมีค่าเริ่มต้นเป็นค่าที่ไม่แน่นอน ในขณะที่แบบลงทะเบียนจะร้องขอพื้นที่จัดเก็บข้อมูลแบบลงทะเบียนของ CPU ที่เร็วกว่าและห้ามการเข้าถึงที่อยู่ของตัวแปร

คำว่า "register" เป็นเพียงคำขอเท่านั้น คอมไพเลอร์อาจไม่สนใจหากไม่มีรีจิสเตอร์ว่าง คอมไพเลอร์สมัยใหม่จะปรับปรุงการใช้งานรีจิสเตอร์โดยอัตโนมัติ ดังนั้นคำหลักนี้จึงไม่ค่อยจำเป็นอีกต่อไป

ตัวแปรแบบ static และ extern จะอยู่ในส่วนของหน่วยความจำที่เริ่มต้นด้วยค่าศูนย์ตลอดทั้งโปรแกรม ดังนั้นจึงเริ่มต้นที่ศูนย์ ส่วนตัวแปรแบบ auto จะใช้หน่วยความจำแบบ stack ซ้ำping ไม่ว่าจะมีมูลค่าอะไรหลงเหลืออยู่ก็ตาม

การประกาศแบบ extern เป็นเพียงการประกาศตัวแปรที่ถูกนิยามไว้ที่อื่น และไม่สามารถกำหนดค่าเริ่มต้นได้ การนิยามที่แท้จริงซึ่งอยู่ในไฟล์หนึ่ง จะจัดสรรพื้นที่จัดเก็บ และการเชื่อมโยงจะเชื่อมต่อการอ้างอิงทั้งหมดเข้ากับตัวแปรนั้น

ส่วนใหญ่ก็ใช่ แต่ก็ไม่ใช่ทั้งหมด C++ ยกเลิกการใช้งานคีย์เวิร์ด register และนำ auto มาใช้สำหรับการอนุมานประเภทข้อมูลแทน ส่วน static และ extern ทำงานคล้ายกัน C++ เพิ่มกฎการจัดเก็บข้อมูลแบบ thread_local และ class-member

ใช่แล้ว ผู้ช่วย AI จะอธิบายคำว่า auto, register, static และ extern แนะนำตัวระบุที่เหมาะสมสำหรับแต่ละตัวแปร และแจ้งเตือนการใช้งานที่ไม่ถูกต้อง เช่น การนำที่อยู่ของตัวแปร register มาใช้

นักบิน GitHub โปรแกรมจะเติมคำอัตโนมัติสำหรับตัวนับแบบคงที่ การประกาศตัวแปรภายนอกข้ามไฟล์ และคำแนะนำเกี่ยวกับรีจิสเตอร์ จากนั้นจะอธิบายขอบเขตและอายุการใช้งานแบบเรียลไทม์ขณะที่คุณพิมพ์

สรุปโพสต์นี้ด้วย: