อ่าน 13 นาที
ประเภทข้อมูล C
ในภาษา การเขียนโปรแกรม C ชนิดข้อมูล ประกอบด้วยความหมายและลักษณะเฉพาะของการจัดเก็บข้อมูล โดยจะแสดงออกมาในไวยากรณ์ของภาษาในรูปแบบของการประกาศ ตำแหน่งหน่วยความจำ หรือ ตัวแปร...
ประเภทข้อมูล C
| ไลบรารีมาตรฐาน C (libc) |
|---|
| หัวข้อทั่วไป |
| ส่วนหัวเบ็ดเตล็ด |
ในภาษาการเขียนโปรแกรม C ชนิดข้อมูลประกอบด้วยความหมายและลักษณะเฉพาะของการจัดเก็บข้อมูล โดยจะแสดงออกมาในไวยากรณ์ของภาษาในรูปแบบของการประกาศตำแหน่งหน่วยความจำหรือตัวแปรชนิดข้อมูลยังเป็นตัวกำหนดประเภทของการดำเนินการหรือวิธีการประมวลผลข้อมูลอีกด้วย
ภาษา C มีประเภททางคณิตศาสตร์พื้นฐาน เช่น ประเภท จำนวนเต็มและจำนวนจริงและไวยากรณ์สำหรับสร้างอาร์เรย์และประเภทผสม ไลบรารีมาตรฐานของภาษา Cมีคำจำกัดความเพิ่มเติมของประเภทสนับสนุนที่มีคุณสมบัติเพิ่มเติม เช่น การจัดเก็บข้อมูลที่มีขนาดที่แน่นอน โดยไม่ขึ้นอยู่กับการใช้งานภาษาบนแพลตฟอร์มฮาร์ดแวร์เฉพาะ[ 1 ] [ 2 ]
ประเภทหลัก
ประเภทหลัก
ภาษา C มีตัวระบุชนิดข้อมูลทางคณิตศาสตร์พื้นฐานสี่แบบ ได้แก่char, int, floatและdouble(รวมถึงชนิดข้อมูลบูลีนด้วยbool) และตัวดัดแปลง ได้แก่signed, unsigned, short, และlongตารางต่อไปนี้แสดงรายการการผสมผสานที่อนุญาตในการระบุการประกาศเฉพาะขนาดพื้นที่จัดเก็บข้อมูลจำนวนมาก
| พิมพ์ | คำอธิบาย | ขนาด (บิต) [ a ] | ตัวระบุรูปแบบ | พิสัย | คำต่อท้ายสำหรับค่าคงที่ทศนิยม |
|---|---|---|---|---|---|
bool | ประเภท บูลีน เพิ่มในC23 (ก่อนหน้านี้_Boolเพิ่มในC99 [ 3 ]แต่ไม่ได้ระบุขนาดและช่วง) | 1 (ตรงเป๊ะ) | %d | [ เท็จ , จริง ] | ไม่มีข้อมูล |
char | หน่วยที่เล็กที่สุดที่สามารถระบุตำแหน่งของเครื่องได้ซึ่งสามารถบรรจุชุดอักขระพื้นฐานได้ เป็น ประเภท จำนวนเต็มประเภทจริงอาจเป็นแบบมีเครื่องหมายหรือไม่มีเครื่องหมาย ประกอบด้วยCHAR_BITบิต[ 4 ] | ≥8 | %c | [ CHAR_MIN , CHAR_MAX ] | ไม่มีข้อมูล |
signed char | มีขนาดเท่ากับcharแต่รับประกันว่าจะมีการลงนาม สามารถบรรจุช่วง อย่างน้อย [−127, +127] ได้ [ 4 ] [ b ] | ≥8 | %c[ค] | [ SCHAR_MIN , SCHAR_MAX ] [ 7 ] | ไม่มีข้อมูล |
unsigned char | มีขนาดเท่ากับcharแต่รับประกันว่าไม่มีเครื่องหมาย ประกอบด้วยช่วง อย่างน้อย [0, 255] [ 8 ] | ≥8 | %c[ d ] | [0, UCHAR_MAX ] | ไม่มีข้อมูล |
| ประเภทจำนวนเต็ม สั้นแบบมีเครื่องหมาย สามารถบรรจุได้อย่างน้อย[−32 767 ,+32 767 ]ช่วง [ 4 ] [ b ] | ≥16 | %hiหรือ%hd | [ SHRT_MIN , SHRT_MAX ] | ไม่มีข้อมูล |
| ชนิดข้อมูลจำนวนเต็ม สั้นที่ไม่มีเครื่องหมาย ประกอบด้วยอย่างน้อย[0 ,65 535 ]ช่วง [ 4 ] | ≥16 | %hu | [0, USHRT_MAX ] | ไม่มีข้อมูล |
| ประเภทจำนวนเต็มแบบมีเครื่องหมายพื้นฐาน สามารถเก็บค่าได้อย่างน้อย[−32 767 ,+32 767 ]ช่วง [ 4 ] [ b ] | ≥16 | %iหรือ%d | [ INT_MIN , INT_MAX ] | ไม่มี[ 9 ] |
| ชนิดข้อมูลจำนวนเต็มที่ไม่ระบุเครื่องหมายพื้นฐาน ประกอบด้วยอย่างน้อย[0 ,65 535 ]ช่วง [ 4 ] | ≥16 | %u | [0, UINT_MAX ] | uหรือU [ 9 ] |
| ประเภทจำนวนเต็มแบบมีเครื่องหมาย ยาวสามารถเก็บค่าได้อย่างน้อย[−2 147 483 647 ,+2 147 483 647 ]ช่วง [ 4 ] [ b ] | ≥32 | %liหรือ%ld | [ LONG_MIN , LONG_MAX ] | lหรือL [ 9 ] |
| ประเภทจำนวนเต็มไม่ติดลบ แบบยาวสามารถเก็บค่าได้อย่างน้อย[0 ,4 294 967 295 ]ช่วง [ 4 ] | ≥32 | %lu | [0, ULONG_MAX ] | ทั้งuหรือUและlหรือL [ 9 ] |
| ประเภทจำนวนเต็มแบบมีเครื่องหมาย ขนาดใหญ่มากสามารถเก็บค่าได้อย่างน้อย[−9 223 372 036 854 775 807 ,+9 223 372 036 854 775 807 ]ช่วง [ 4 ] [ b ]ระบุไว้ตั้งแต่มาตรฐานเวอร์ชัน C99 | ≥64 | %lliหรือ%lld | [ LLONG_MIN , LLONG_MAX ] | llหรือLL [ 9 ] |
| ประเภทจำนวนเต็ม ยาวมากที่ไม่มีเครื่องหมาย ประกอบด้วยอย่างน้อย[0 ,18 446 744 073 709 551 615 ]ช่วง [ 4 ]ระบุตั้งแต่มาตรฐานเวอร์ชัน C99 | ≥64 | %llu | [0, ULLONG_MAX ] | ทั้งuหรือUและllหรือLL [ 9 ] |
float | ประเภทเลขทศนิยมจริง มักเรียกว่าประเภทเลขทศนิยมความแม่นยำเดี่ยว คุณสมบัติที่แท้จริงไม่ได้ระบุไว้ (ยกเว้นขีดจำกัดขั้นต่ำ) อย่างไรก็ตาม ในระบบส่วนใหญ่ นี่คือรูปแบบเลขทศนิยมไบนารีความแม่นยำเดี่ยว IEEE 754 (32 บิต) รูปแบบนี้เป็นข้อกำหนดของภาคผนวก F ที่เป็นทางเลือก "การคำนวณเลขทศนิยม IEC 60559" | แปลงจากข้อความ: [ e ]
| เอฟหรือเอฟ | ||
double | ประเภทเลขทศนิยมจริง มักเรียกว่าประเภทเลขทศนิยมความแม่นยำสองเท่า คุณสมบัติที่แท้จริงไม่ได้ระบุไว้ (ยกเว้นขีดจำกัดขั้นต่ำ) อย่างไรก็ตาม ในระบบส่วนใหญ่ นี่คือรูปแบบเลขทศนิยมไบนารีความแม่นยำสองเท่า IEEE 754 (64 บิต) รูปแบบนี้เป็นข้อกำหนดของภาคผนวก F ที่เป็นทางเลือก "การคำนวณเลขทศนิยม IEC 60559" |
| ไม่มี | ||
long double | ชนิดข้อมูลทศนิยมจริง มักถูกแปลงเป็น รูปแบบตัวเลขทศนิยม ความแม่นยำสูงคุณสมบัติที่แท้จริงไม่ได้ระบุไว้ อาจเป็นรูปแบบทศนิยมความแม่นยำสูง x86 (80 บิต แต่โดยทั่วไปคือ 96 บิต หรือ 128 บิตในหน่วยความจำพร้อมไบต์เติม ) รูปแบบ " double-double " ที่ไม่ใช่มาตรฐาน IEEE (128 บิต) รูปแบบทศนิยมความแม่นยำสูง IEEE 754 (128 บิต) หรือเหมือนกับ double ดูบทความเกี่ยวกับ long doubleสำหรับรายละเอียดเพิ่มเติม | %Lf%LF%Lg%LG%Le%LE%La%LA[ f ] | ลหรือแอล |
- ^คำศัพท์มาตรฐานที่ใช้เรียกขนาดของชนิดข้อมูลจำนวนเต็มในหน่วยบิตคือ ` width`ความกว้างนี้ไม่รวมบิตที่ใช้เติมช่องว่าง (padding bits)
- ช่วงค่าต่ำสุด[ − (2 n −1 −1 ), 2 n −1 −1 ] (เช่น [−127,127]) มาจากการแสดงจำนวนเต็มต่างๆ ที่มาตรฐานอนุญาต ( ส่วนเติมเต็มหนึ่ง , เครื่องหมาย-ขนาด , ส่วนเติมเต็มสอง ) [ 5 ]อย่างไรก็ตาม แพลตฟอร์มส่วนใหญ่ใช้ส่วนเติมเต็มสอง ซึ่งหมายถึงช่วงค่าในรูปแบบ[ −2 m −1 , 2 m −1 −1] โดยที่m ≥ nสำหรับการใช้งานเหล่านี้ เช่น [−128,127] ( และ ) สำหรับ อักขระแบบมีเครื่องหมาย 8 บิตตั้งแต่ C23 การแสดงค่าที่อนุญาตเพียงอย่างเดียวคือส่วนเติมเต็มสอง ดังนั้นค่าจึงอยู่ในช่วงอย่างน้อย[−2 n −1 , 2 n −1 −1 ] [ 6 ]
SCHAR_MIN == −128SCHAR_MAX == 127 - ^หรือ
%hhiสำหรับการแสดงผลเชิงตัวเลข - ^หรือ
%hhuสำหรับการแสดงผลเชิงตัวเลข - ^รูปแบบสตริงเหล่านี้ยังมีอยู่สำหรับการจัดรูปแบบข้อความ แต่จะทำงานกับค่าทศนิยม
- ^ a bตัวพิมพ์ใหญ่แตกต่างจากตัวพิมพ์เล็กในผลลัพธ์ ตัวระบุตัวพิมพ์ใหญ่จะสร้างค่าเป็นตัวพิมพ์ใหญ่ และตัวระบุตัวพิมพ์เล็กจะสร้างค่าเป็นตัวพิมพ์เล็ก (%A, %E, %F, %G จะสร้างค่าเช่น INF, NAN และ E (เลขชี้กำลัง) ในตัวพิมพ์ใหญ่)
ขนาดจริงของ ชนิด ข้อมูลจำนวนเต็มจะแตกต่างกันไปตามการใช้งาน มาตรฐานกำหนดเพียงความสัมพันธ์ด้านขนาดระหว่างชนิดข้อมูลและขนาดขั้นต่ำสำหรับแต่ละชนิดข้อมูลเท่านั้น:
ข้อกำหนดความสัมพันธ์คือ ต้องlong longไม่น้อยกว่าlongซึ่งไม่น้อยกว่า ซึ่งไม่intน้อยกว่าshortเนื่องจากcharขนาดของ เป็นขนาดขั้นต่ำสุดของชนิดข้อมูลที่รองรับเสมอ จึงไม่มีชนิดข้อมูลอื่นใด (ยกเว้นบิตฟิลด์ ) ที่จะมีขนาดเล็กกว่าได้
ขนาดขั้นต่ำสำหรับcharคือ 8 บิต ขนาดขั้นต่ำสำหรับshortและintคือ 16 บิต ส่วน สำหรับlongนั้นมีขนาด 32 บิต และlong longต้องมีอย่างน้อย 64 บิต
ประเภทintควรเป็นประเภทจำนวนเต็มที่โปรเซสเซอร์เป้าหมายทำงานได้อย่างมีประสิทธิภาพมากที่สุด ซึ่งช่วยให้มีความยืดหยุ่นสูง เช่น ประเภททั้งหมดสามารถเป็น 64 บิตได้ อย่างไรก็ตาม รูปแบบความกว้างของจำนวนเต็ม (โมเดลข้อมูล) ที่แตกต่างกันหลายแบบก็เป็นที่นิยม เนื่องจากโมเดลข้อมูลกำหนดวิธีการสื่อสารระหว่างโปรแกรมต่างๆ จึงมีการใช้โมเดลข้อมูลที่เป็นเอกภาพภายในอินเทอร์เฟซแอปพลิเคชันระบบปฏิบัติการที่กำหนด[ 10 ]
ในทางปฏิบัติcharโดยทั่วไปจะมีขนาด 8 บิต และshortโดยทั่วไปจะมีขนาด 16 บิต (เช่นเดียวกับค่าที่ไม่ระบุเครื่องหมาย) สิ่งนี้เป็นจริงสำหรับแพลตฟอร์มที่หลากหลาย เช่นSunOS 4 Unix ในยุค 1990, Microsoft MS-DOS , Linuxรุ่นใหม่และ Microchip MCC18 สำหรับไมโครคอนโทรลเลอร์ PIC 8 บิตแบบฝังตัวPOSIX กำหนดให้มีcharขนาด 8 บิตพอดี[ 11 ] [ 12 ]
กฎต่างๆ ในมาตรฐาน C ทำให้unsigned charประเภทพื้นฐานที่ใช้สำหรับอาร์เรย์เหมาะสมที่จะจัดเก็บวัตถุที่ไม่ใช่ฟิลด์บิตใดๆ ได้แก่ การไม่มีบิตเติมและการแสดงกับดัก คำจำกัดความของการแสดงวัตถุ [ 8 ] และความเป็นไปได้ของ การใช้นามแฝง[ 13 ]
ขนาดและลักษณะการทำงานของชนิดข้อมูลจุดลอยตัวนั้นแตกต่างกันไปตามการใช้งาน ข้อกำหนดเพียงอย่างเดียวคือlong doubleต้องไม่น้อยกว่าdoubleซึ่งต้องไม่น้อยกว่า โดยปกติแล้ว จะใช้รูปแบบเลขฐานสองแบบIEEE 754floatขนาด 32 บิตและ 64 บิต สำหรับ และตามลำดับ floatdouble
มาตรฐานC99ประกอบด้วยชนิดข้อมูลจุดลอยตัวจริงแบบใหม่float_tและdouble_tซึ่งกำหนดไว้ใน ชนิดข้อมูล<math.h>เหล่านี้สอดคล้องกับชนิดข้อมูลที่ใช้สำหรับผลลัพธ์ระดับกลางของนิพจน์จุดลอยตัวเมื่อFLT_EVAL_METHODมีค่าเป็น 0, 1 หรือ 2 ชนิดข้อมูลเหล่านี้อาจมีความกว้างlong doubleมากกว่า
นอกจากนี้ C99 ยังเพิ่มประเภทข้อมูลที่ซับซ้อนได้แก่float _Complex, double _Complex, C11เพิ่ม ประเภท ข้อมูลสมมติ (ซึ่งอธิบายไว้ในภาคผนวกข้อมูลของ C99) ได้แก่, , การรวมส่วนหัวทำให้สามารถเข้าถึงประเภทข้อมูลเหล่านี้ได้โดยใช้และตามลำดับ long double _Complexfloat _Imaginarydouble _Imaginarylong double _Imaginary<complex.h>compleximaginary
ประเภทบูลีน
C99เพิ่มชนิดข้อมูลบูลีน (Boolean_Bool ) นอกจากนี้<stdbool.h>ส่วนหัวยังกำหนดให้boolเป็นชื่อเรียกย่อที่สะดวกสำหรับชนิดนี้ และยังมีมาโครสำหรับtrueและfalseอีก ด้วย _Boolทำงานคล้ายกับชนิดข้อมูลจำนวนเต็มปกติ โดยมีข้อยกเว้นหนึ่งอย่างคือ การแปลงใดๆ เป็น จะ_Boolให้ค่า 0 (เท็จ) ถ้าค่าเท่ากับ 0 มิฉะนั้นจะให้ค่า 1 (จริง) พฤติกรรมนี้มีไว้เพื่อหลีกเลี่ยงการโอเวอร์โฟลว์ของจำนวนเต็มในการแปลงแบบแคบโดยปริยาย ตัวอย่างเช่น ในโค้ดต่อไปนี้:
unsigned char b = 256 ;ถ้า( b ) { // ทำบางอย่าง}ตัวแปรbจะมีค่าเป็นเท็จหากunsigned charมีขนาด 8 บิต เนื่องจากค่า 256 ไม่สามารถใส่ลงในชนิดข้อมูลได้ ทำให้ใช้เพียง 8 บิตล่าง ส่งผลให้ได้ค่าเป็นศูนย์ อย่างไรก็ตาม การเปลี่ยนชนิดข้อมูลจะทำให้โค้ดก่อนหน้านี้ทำงานได้ตามปกติ
_Bool b = 256 ;ถ้า( b ) { // ทำบางอย่าง}ชนิดข้อมูลนี้_Boolยังช่วยให้ค่าที่เป็นจริงเปรียบเทียบกันได้เท่ากันเสมอ:
_Bool a = 1 ; _Bool b = 2 ;ถ้า( a == b ) { // โค้ดส่วนนี้จะทำงาน}ในC23 ( boolและค่าของมันtrueและfalse) กลายเป็นฟังก์ชันหลักของภาษา (ทำให้เนื้อหาของ<stdbool.h>ล้าสมัย[ 14 ] [ 15 ] ) ทำให้สามารถใช้ตัวอย่างโค้ดต่อไปนี้ได้:
bool b = true ;ถ้า( b ) { // โค้ดนี้จะทำงาน}ประเภทจำนวนเต็มที่แม่นยำระดับบิต
ตั้งแต่C23เป็นต้นมา ภาษาอนุญาตให้โปรแกรมเมอร์กำหนดจำนวนเต็มที่มีความกว้างเป็นจำนวนบิตตามอำเภอใจ ประเภทเหล่านั้นระบุเป็น โดยที่Nเป็นนิพจน์ค่าคงที่จำนวนเต็มที่แสดงจำนวนบิต รวมถึงบิตเครื่องหมายสำหรับประเภทที่มีเครื่องหมาย ซึ่งแสดงในรูปแบบสองส่วนเติมเต็ม ค่าสูงสุดของNกำหนดโดยและมีค่าอย่างน้อยดังนั้น ประเภท(หรือ) จะมีค่าตั้งแต่ -2 ถึง 1 ในขณะที่จะมีค่าตั้งแต่ 0 ถึง 3 ประเภทยังมีอยู่ด้วย โดยมีค่าเป็น 0 หรือ 1 และไม่มีประเภทที่มีเครื่องหมายที่เทียบเท่ากัน[ 16 ]ข้อเสนอสำหรับC2Yเสนอให้ยกเลิกข้อจำกัดนี้และอนุญาตให้ซึ่งจะมีค่าที่เป็นไปได้คือ 0 และ -1 โดยลบกรณีพิเศษสำหรับออก[ 17 ]_BitInt(N)BITINT_MAXWIDTHULLONG_WIDTH_BitInt(2)signed_BitInt(2)unsigned_BitInt(2)unsigned_BitInt(1)signed_BitInt(1)unsigned_BitInt(1)
ขนาดและประเภทความแตกต่างของตัวชี้
ข้อกำหนดของภาษา C ประกอบด้วยtypedef s และเพื่อใช้แทนปริมาณที่เกี่ยวข้องกับหน่วยความจำ ขนาดของพวกมันถูกกำหนดตามความสามารถในการคำนวณทางคณิตศาสตร์ของโปรเซสเซอร์เป้าหมาย ไม่ใช่ความสามารถของหน่วยความจำ เช่น พื้นที่แอดเดรสที่ใช้งานได้ ทั้งสองประเภทนี้ถูกกำหนดไว้ในไฟล์เฮดเดอร์ size_tptrdiff_t<stddef.h>
size_tเป็นชนิดข้อมูลจำนวนเต็มไม่ระบุเครื่องหมายที่ใช้แสดงขนาดของวัตถุใดๆ (รวมถึงอาร์เรย์) ในการใช้งานเฉพาะนั้นๆ ตัวดำเนินการ `sizeof` จะให้ค่าของชนิดข้อมูลนี้ขนาดสูงสุดของ `sizeof` กำหนดโดย`sizeof` ซึ่งเป็นค่าคงที่มาโครที่กำหนดไว้ในส่วนหัว ` sizeof` รับประกันว่า `sizeof` จะมีความกว้างอย่างน้อย 16 บิต นอกจากนี้ POSIX ยังรวมถึง `sizeof` ซึ่งเป็นชนิดข้อมูลจำนวนเต็มระบุเครื่องหมายที่มีความกว้างเท่ากับ `sizeof` ด้วย size_tsize_tSIZE_MAX<stdint.h>size_tssize_tsize_t
ptrdiff_tเป็นชนิดข้อมูลจำนวนเต็มที่มีเครื่องหมาย ใช้สำหรับแสดงผลต่างระหว่างตัวชี้ รับประกันว่าจะมีผลเฉพาะกับตัวชี้ชนิดเดียวกันเท่านั้น การลบตัวชี้ที่มีชนิดข้อมูลต่างกันนั้นขึ้นอยู่กับการใช้งานของแต่ละระบบ
ส่วนติดต่อกับคุณสมบัติของประเภทพื้นฐาน
ข้อมูลเกี่ยวกับคุณสมบัติที่แท้จริง เช่น ขนาดของชนิดข้อมูลทางคณิตศาสตร์พื้นฐาน จะถูกระบุผ่านค่าคงที่มาโครในไฟล์เฮดเดอร์สองไฟล์: <limits.h>ไฟล์เฮดเดอร์หนึ่งกำหนดมาโครสำหรับชนิดข้อมูลจำนวนเต็ม และ<float.h>อีกไฟล์เฮดเดอร์หนึ่งกำหนดมาโครสำหรับชนิดข้อมูลทศนิยม ค่าที่แท้จริงจะขึ้นอยู่กับการใช้งานในแต่ละระบบ
คุณสมบัติของชนิดข้อมูลจำนวนเต็ม
CHAR_BIT– ขนาดของชนิดข้อมูล char ในหน่วยบิต ซึ่งโดยทั่วไปเรียกว่าขนาดของไบต์ (อย่างน้อย 8 บิต)SCHAR_MIN( C99) – ค่าต่ำสุดที่เป็นไปได้ของชนิดข้อมูลจำนวนเต็มที่มี เครื่องหมาย : signed char, signedSHRT_MINshort , signed int, signed long, signed long longINT_MINLONG_MINLLONG_MINSCHAR_MAX( C99) – ค่าสูงสุดที่เป็นไปได้ของชนิดข้อมูลจำนวนเต็มที่มี เครื่องหมาย : signed char, signedSHRT_MAXshort , signed int, signed long, signed long longINT_MAXLONG_MAXLLONG_MAXUCHAR_MAX( C99)USHRT_MAX– ค่าสูงสุดที่เป็นไปได้ของชนิดข้อมูลจำนวนเต็มที่ไม่มี เครื่องหมาย : unsigned char, unsigned short, unsigned int,UINT_MAXunsigned long, unsigned long longULONG_MAXULLONG_MAXCHAR_MIN– ค่าต่ำสุดที่เป็นไปได้ของอักขระCHAR_MAX– ค่าสูงสุดที่เป็นไปได้ของอักขระMB_LEN_MAX– จำนวนไบต์สูงสุดในอักขระแบบหลายไบต์BOOL_WIDTH(C23) - ความกว้างบิตของ_Bool, เท่ากับ 1 เสมอCHAR_WIDTH(C23) - ความกว้างบิตของchar;CHAR_WIDTH,UCHAR_WIDTHและSCHAR_WIDTHมีค่าเท่ากันCHAR_BITตามนิยามSCHAR_WIDTH,SHRT_WIDTH,INT_WIDTH,LONG_WIDTH,LLONG_WIDTH(C23) - ความกว้างบิตของsigned char,short,int,long, และlong longตามลำดับUCHAR_WIDTH,USHRT_WIDTH,UINT_WIDTH,ULONG_WIDTH,ULLONG_WIDTH(C23) - ความกว้างบิตของunsigned char,unsigned short,unsigned int,unsigned long, และunsigned long longตามลำดับ
คุณสมบัติของชนิดข้อมูลจุดลอยตัว
FLT_MIN,DBL_MIN,LDBL_MIN– ค่าบวกขั้นต่ำที่ถูกทำให้เป็นมาตรฐานของ float, double และ long double ตามลำดับFLT_TRUE_MIN,DBL_TRUE_MIN,LDBL_TRUE_MIN(C11) – ค่าบวกต่ำสุดของ float, double และ long double ตามลำดับFLT_MAX,DBL_MAX,LDBL_MAX– ค่าสูงสุดที่จำกัดของ float, double และ long double ตามลำดับFLT_ROUNDS– โหมดการปัดเศษสำหรับการคำนวณเลขทศนิยมFLT_EVAL_METHOD(C99) – วิธีการประเมินนิพจน์ที่เกี่ยวข้องกับชนิดข้อมูลจุดลอยตัวที่แตกต่างกันFLT_RADIX– ฐานของเลขชี้กำลังในประเภทข้อมูลทศนิยมFLT_DIG,DBL_DIG,LDBL_DIG– จำนวนหลักทศนิยมที่สามารถแสดงได้โดยไม่สูญเสียความแม่นยำด้วย float, double และ long double ตามลำดับFLT_EPSILON,DBL_EPSILON,LDBL_EPSILON– ผลต่างระหว่าง 1.0 กับค่าถัดไปที่สามารถแทนได้ของ float, double และ long double ตามลำดับFLT_MANT_DIG,DBL_MANT_DIG,LDBL_MANT_DIG– จำนวนFLT_RADIXหลักฐาน - ในส่วนสำคัญของเลขทศนิยมสำหรับชนิด float, double และ long double ตามลำดับFLT_MIN_EXP,DBL_MIN_EXP,LDBL_MIN_EXP– จำนวนเต็มลบที่น้อยที่สุด ซึ่งFLT_RADIXเมื่อยกกำลังด้วยค่าที่น้อยกว่าจำนวนนั้นหนึ่ง จะได้ค่า float, double และ long double ที่เป็นค่ามาตรฐาน ตามลำดับFLT_MIN_10_EXP,DBL_MIN_10_EXP,LDBL_MIN_10_EXP– จำนวนเต็มลบที่น้อยที่สุดที่ทำให้ 10 ยกกำลังด้วยค่าดังกล่าวเป็น float, double และ long double ที่ถูกทำให้เป็นค่ามาตรฐานตามลำดับFLT_MAX_EXP,DBL_MAX_EXP,LDBL_MAX_EXP– จำนวนเต็มบวกสูงสุดที่FLT_RADIXเมื่อยกกำลังด้วยค่าที่น้อยกว่าจำนวนนั้นหนึ่ง จะได้ค่า float, double และ long double ที่เป็นค่ามาตรฐาน ตามลำดับFLT_MAX_10_EXP,DBL_MAX_10_EXP,LDBL_MAX_10_EXP– จำนวนเต็มบวกสูงสุดที่ทำให้ 10 ยกกำลังด้วยค่าดังกล่าวเป็น float, double และ long double ที่ถูกทำให้เป็นค่ามาตรฐานตามลำดับDECIMAL_DIG(C99) – จำนวนหลักทศนิยมขั้นต่ำที่ทำให้สามารถแสดงจำนวนใดๆ ของชนิดข้อมูลจุดลอยตัวที่รองรับได้กว้างที่สุดในรูปทศนิยมด้วยความแม่นยำตามจำนวนDECIMAL_DIGหลักทศนิยมที่กำหนด และอ่านกลับเป็นชนิดข้อมูลจุดลอยตัวเดิมได้โดยไม่เปลี่ยนแปลงค่า ต้องDECIMAL_DIGมีอย่างน้อย 10 หลัก
ประเภทจำนวนเต็มที่มีความกว้างคงที่
มาตรฐานC99ประกอบด้วยคำจำกัดความของประเภทจำนวนเต็มใหม่หลายประเภทเพื่อเพิ่มความสามารถในการพกพาของโปรแกรม[ 2 ]ประเภทจำนวนเต็มพื้นฐานที่มีอยู่แล้วถือว่าไม่เพียงพอ เนื่องจากขนาดจริงของประเภทเหล่านั้นถูกกำหนดโดยการใช้งานและอาจแตกต่างกันไปในระบบต่างๆ ประเภทใหม่เหล่านี้มีประโยชน์อย่างยิ่งในสภาพแวดล้อมแบบฝังตัวซึ่งโดยปกติฮาร์ดแวร์จะรองรับเพียงไม่กี่ประเภท และการรองรับนั้นจะแตกต่างกันไปในแต่ละสภาพแวดล้อม ประเภทใหม่ทั้งหมดได้รับการกำหนดไว้ใน<inttypes.h>ส่วนหัวและยังมีให้ใช้งานใน<stdint.h>ส่วนหัวด้วย ประเภทต่างๆ สามารถจัดกลุ่มได้เป็นหมวดหมู่ดังต่อไปนี้:
- ประเภทจำนวนเต็มที่มีขนาดความกว้างที่แน่นอน ซึ่งรับประกันว่าจะมีจำนวน บิต n เท่ากัน ในทุกการใช้งาน รวมไว้เฉพาะในกรณีที่มีให้ใช้งานในการใช้งานนั้นๆ
- ชนิดข้อมูลจำนวนเต็มที่ความกว้างน้อยที่สุด ซึ่งรับประกันว่าเป็นชนิดข้อมูลที่เล็กที่สุดที่มีอยู่ในระบบ และมีจำนวนบิตอย่างน้อยn ตามที่ระบุไว้ รับประกันว่าจะต้องมีการระบุค่า N อย่างน้อยเท่ากับ 8, 16, 32, 64
- ประเภทจำนวนเต็มที่เร็วที่สุดซึ่งรับประกันว่าเป็นประเภทจำนวนเต็มที่เร็วที่สุดที่มีอยู่ในระบบ โดยมีจำนวนบิตอย่างน้อยn ตามที่ระบุไว้ รับประกันว่าจะต้องมีการระบุค่า N อย่างน้อยเท่ากับ 8, 16, 32, 64
- ประเภทข้อมูลจำนวนเต็มที่รับประกันว่าสามารถเก็บค่าตัวชี้ได้ รวมไว้เฉพาะในกรณีที่มีให้ใช้งานในระบบเท่านั้น
- ประเภทจำนวนเต็มที่มีความกว้างสูงสุด ซึ่งรับประกันได้ว่าเป็นประเภทจำนวนเต็มที่ใหญ่ที่สุดในระบบการใช้งาน
ตารางต่อไปนี้สรุปประเภทและอินเทอร์เฟซสำหรับรับรายละเอียดการใช้งาน ( nหมายถึงจำนวนบิต):
| ประเภทหมวดหมู่ | ประเภทลายเซ็น | ประเภทที่ไม่มีเครื่องหมาย | ||||
|---|---|---|---|---|---|---|
| พิมพ์ | ค่าต่ำสุด | ค่าสูงสุด | พิมพ์ | ค่าต่ำสุด | ค่าสูงสุด | |
| ความกว้างที่แน่นอน | intn_t | INTn_MIN | INTn_MAX | uintn_t | 0 | UINTn_MAX |
| ความกว้างน้อยที่สุด | int_leastn_t | INT_LEASTn_MIN | INT_LEASTn_MAX | uint_leastn_t | 0 | UINT_LEASTn_MAX |
| เร็วที่สุด | int_fastn_t | INT_FASTn_MIN | INT_FASTn_MAX | uint_fastn_t | 0 | UINT_FASTn_MAX |
| ตัวชี้ | intptr_t | INTPTR_MIN | INTPTR_MAX | uintptr_t | 0 | UINTPTR_MAX |
| ความกว้างสูงสุด | intmax_t | INTMAX_MIN | INTMAX_MAX | uintmax_t | 0 | UINTMAX_MAX |
ตัวกำหนดรูปแบบ printf และ scanf
ส่วนหัว นี้<inttypes.h>มีคุณสมบัติที่ช่วยเพิ่มประสิทธิภาพการทำงานของประเภทที่กำหนดไว้ใน<stdint.h>ส่วนหัว โดยจะกำหนดมาโครสำหรับ ตัวระบุ รูปแบบสตริง printfและscanfที่สอดคล้องกับประเภทที่กำหนดไว้<stdint.h>และฟังก์ชันต่างๆ สำหรับการทำงานกับ ประเภท intmax_tเหล่านั้นuintmax_tส่วนหัวนี้ถูกเพิ่มเข้ามาใน C99
สตริงรูปแบบ printf
มาโครอยู่ในรูปแบบ`<fmt>` โดยที่`{fmt}`กำหนดรูปแบบการแสดงผล และเป็นหนึ่งใน`<decimal>`, `<hexadecimal>`, `<octal>`, `<unsigned>` และ`<integer>` ` {type}`กำหนดชนิดของอาร์กิวเมนต์ และเป็นหนึ่งใน`<int>` , ` <int>`, `<int>`, ` <int>`, `<int> `, โดยที่ `<int> ` สอดคล้องกับจำนวนบิตในอาร์กิวเมนต์ PRI{fmt}{type}dxouinFASTnLEASTnPTRMAXn
สตริงรูปแบบscanf
มาโครอยู่ในรูปแบบ`<fmt>` โดยที่`{fmt}`กำหนดรูปแบบการแสดงผล และเป็นหนึ่งใน`<decimal>`, `<hexadecimal>`, `<octal>`, `<unsigned>` และ`<integer>` ` {type}`กำหนดชนิดของอาร์กิวเมนต์ และเป็นหนึ่งใน`<int>` , ` <int>`, `<int>`, ` <int>`, `<int> `, โดยที่ `<int> ` สอดคล้องกับจำนวนบิตในอาร์กิวเมนต์ SCN{fmt}{type}dxouinFASTnLEASTnPTRMAXn
ฟังก์ชัน
ประเภทจุดลอยตัวเพิ่มเติม
เช่นเดียวกับชนิดข้อมูลจำนวนเต็มที่มีความกว้างคงที่ มาตรฐาน ISO/IEC TS 18661 กำหนดชนิดข้อมูลทศนิยมสำหรับการแลกเปลี่ยนข้อมูล IEEE 754 และรูปแบบขยายในระบบเลขฐานสองและฐานสิบ:
_FloatNสำหรับรูปแบบการแลกเปลี่ยนไบนารี_DecimalNสำหรับรูปแบบการแลกเปลี่ยนเลขฐานสิบ;_FloatNxสำหรับรูปแบบไบนารีแบบขยาย;_DecimalNxสำหรับรูปแบบเลขฐานสิบแบบขยาย
จุดชี้
ทุกชนิดข้อมูลTจะมีตัวชี้T ชนิดข้อมูลที่สอดคล้องกัน ตัวชี้คือชนิดข้อมูลที่เก็บที่อยู่ของตำแหน่งจัดเก็บข้อมูลของตัวแปรชนิดนั้นๆ โดยจะประกาศตัวชี้ด้วยเครื่องหมายดอกจัน (* *) ตามหลังชนิดข้อมูลพื้นฐานและอยู่หน้าชื่อตัวแปร การเว้นวรรคก่อนหรือหลังเครื่องหมายดอกจันนั้นไม่จำเป็น
char * p ; long * q ; int * r ;นอกจากนี้ เรายังสามารถประกาศพอยน์เตอร์สำหรับชนิดข้อมูลพอยน์เตอร์ได้ ซึ่งจะสร้างพอยน์เตอร์ทางอ้อมหลายตัว เช่นchar **และint ***รวมถึงพอยน์เตอร์ไปยังชนิดข้อมูลอาร์เรย์ด้วย ชนิดหลังนี้พบได้น้อยกว่าอาร์เรย์ของพอยน์เตอร์ และไวยากรณ์ของมันอาจทำให้สับสนได้:
char * pc [ 10 ]; // อาร์เรย์ขององค์ประกอบ 10 ตัวของ 'ตัวชี้ไปยัง char' char ( * pa )[ 10 ]; // ตัวชี้ไปยังอาร์เรย์ของ char ที่มีองค์ประกอบ 10 ตัวองค์ประกอบนี้pcต้องการหน่วยความจำสิบบล็อกที่มีขนาดเท่ากับตัวชี้ไปยังchar (โดยปกติคือ 40 หรือ 80 ไบต์บนแพลตฟอร์มทั่วไป) แต่ตัวชี้paมีเพียงตัวชี้เดียว (ขนาด 4 หรือ 8 ไบต์) และข้อมูลที่ตัวชี้อ้างถึงเป็นอาร์เรย์ขนาดสิบไบต์ ( ) sizeof*pa==10
C ยังมี "ตัวชี้ไปยังvoid" void *ด้วย[ 18 ]ชื่อ "ตัวชี้ไปยังvoid" ไม่ได้หมายความว่ามันชี้ไปยังvoidหน่วยความจำ (เช่นvoidเดียวกับประเภทที่ไม่สมบูรณ์ที่ไม่มีขนาด) แต่หมายความว่ามันชี้ไปยังบางสิ่งที่มีประเภทไม่ระบุ ต้องแปลงเป็นประเภทตัวชี้อื่นก่อนจึงจะสามารถเข้าถึงค่าที่ชี้ได้ A void *อาจไม่ได้ชี้ไปยังฟังก์ชัน การเรียกใช้จะmallocส่งคืนค่าvoid *และfreeรับvoid *ค่า
ภาษา C ใช้แนวคิดของพอยเตอร์ว่างเพื่อแสดงถึงพอยเตอร์ที่ไม่ได้อ้างอิงถึงข้อมูลที่ถูกต้องใดๆ โดยทั่วไปNULLจะใช้มาโครแทนพอยเตอร์ว่าง โดยอาศัยการแปลงประเภทโดยปริยายเมื่อเป็นไปได้ อย่างไรก็ตาม การใช้งานนี้อาจมีปัญหาและอาจเป็นแหล่งที่มาของข้อผิดพลาดในการเขียนโปรแกรม โดยเฉพาะอย่างยิ่ง การขยายของNULLอาจมีประเภทพอยเตอร์หรือประเภทจำนวนเต็ม ขึ้นอยู่กับการใช้งานC23ได้แนะนำค่าคงที่ที่กำหนดไว้ล่วงหน้าnullptrและประเภทของมันnullptr_t(ซึ่งมีค่าเดียวคือnullptr) เพื่อแสดงค่าคงที่พอยเตอร์ว่าง เป็นตัวพnullptrอยเตอร์อย่างชัดเจน และอาจแปลงเป็นออบเจ็กต์หรือพอยเตอร์ฟังก์ชันใดๆ ก็ได้ และอนุญาตให้มีnullptr_tกรณีเฉพาะใน_Generic[ 19 ] ขนาดและการจัดเรียงของประเภทนี้เหมือนกับพอยเตอร์ไปยังประเภทอักขระ (หรือvoid *) แต่ประเภทพอยเตอร์อื่นๆ อาจยังมีขนาดและการจัดเรียงที่แตกต่างกัน ดังนั้นพอยเตอร์ว่างทั้งหมดจึงไม่สามารถแทนที่ด้วยnullptrได้[ 20 ]
อาร์เรย์
สำหรับทุกประเภทข้อมูลTยกเว้น ประเภท voidและฟังก์ชัน จะมีประเภท"อาร์เรย์ของNองค์ประกอบประเภทT"อยู่ อาร์เรย์คือชุดของค่าทั้งหมดที่มีประเภทเดียวกัน ซึ่งจัดเก็บอยู่ติดกันในหน่วยความจำ อาร์เรย์ขนาดNจะถูกกำหนดดัชนีด้วยจำนวนเต็มตั้งแต่0ถึง และรวมถึงN − 1ตัวอย่างสั้นๆ มีดังนี้:
int a [ 10 ]; // อาร์เรย์ที่มี 10 องค์ประกอบ แต่ละองค์ประกอบเป็นชนิด intอาร์เรย์สามารถกำหนดค่าเริ่มต้นได้ด้วยตัวกำหนดค่าเริ่มต้นแบบผสม แต่ไม่สามารถกำหนดค่าโดยตรงได้ อาร์เรย์จะถูกส่งไปยังฟังก์ชันโดยการส่งพอยเตอร์ไปยังองค์ประกอบแรก อาร์เรย์หลายมิติถูกกำหนดเป็น"อาร์เรย์ของอาร์เรย์..."และทุกมิติยกเว้นมิตินอกสุดจะต้องมีขนาดคงที่ในเวลาคอมไพล์
int aa [ 10 ][ 8 ]; // อาร์เรย์ที่มี 10 องค์ประกอบ แต่ละองค์ประกอบเป็นชนิด 'อาร์เรย์ขององค์ประกอบ int 8 ตัว'ในภาษา C สตริงมักถูกจัดเก็บเป็นอาร์เรย์ของchar( char[]) แต่สิ่งนี้แตกต่างจากพอยเตอร์ไปยังchar( char *) char[]ไม่สามารถกำหนดค่าใหม่ได้ และคงอยู่ที่ตำแหน่งที่ถูกกำหนด ในขณะที่char *สามารถกำหนดค่าใหม่ได้ แต่ไม่สามารถแก้ไขได้
char s [] = "Hello, world!" ; char * p = s ; // s สลายตัวเป็น &s[0], p ชี้ไปยังอักขระตัวแรกแม้ว่าฟังก์ชันจะรับค่าT[]เป็นพารามิเตอร์ แต่ฟังก์ชันนั้นจะสลายตัวเป็นT *ค่าที่ชี้ไปยังองค์ประกอบแรกของฟังก์ชันนั้น
void f ( int a []);// นี่เหมือนกับ: void f ( int * a );การกำหนดดัชนี ของอาร์เรย์นั้นกำหนดขึ้นตามเลขคณิตของตัวชี้นั่นa[i]คือ เทียบเท่ากับ[*(a + i) 21 ]
เอนัม
ในภาษา C นั้น enum เป็นชนิดจำนวนเต็มที่มีค่าจำกัดเฉพาะชุดของค่าคงที่ที่มีชื่อ[ 22 ]ไม่สามารถประกาศ enum ล่วงหน้าได้ นอกจากนี้ enum ยังสามารถกำหนดค่าโดยตรงได้ และมักใช้เพื่อswitchแจงนับกรณีต่างๆ หลายกรณี
#include <stddef.h>enum สถานะ{ OK = 200 , NOT_FOUND = 404 , SERVER_ERROR = 500 };const char * get_status_string ( enum Status status ) { switch ( status ) { case OK : return "สำเร็จ" ; case NOT_FOUND : return "ไม่พบ" ; case SERVER_ERROR : return "เกิดข้อผิดพลาดของเซิร์ฟเวอร์" ; default : unreachable (); } }Enum constants are known at compile time, and are often a safer means to define integral constants than macros. An enum's underlying size is usually int, but since C23 an enum's underlying size can be directly specified to be any integral type.
enumColor:char{RED=1,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET};Because enums are not type-safe, they can be assigned a value of another enum. Enums also need not be assigned values necessarily within the range of defined values.
enumColorcolor=YELLOW;// YELLOW = 3enumMonthmonth=JUNE;// JUNE = 6color=month;// color is now 6 (INDIGO)month=999;// there may not be a value of 999 in enum Month, but still allowedStructs
Structures (structs) aggregate the storage of multiple data items, of potentially differing data types, into one contiguous memory block referenced by a single variable. Members may possibly be padded for memory alignment, and thus it is often recommended to order fields from largest to smallest size for efficient memory usage.
structStudent{charname[50];unsignedintid;unsignedintsemester;floatgpa;};// Positional initialization - values matches field orderstructStudentalice={"Alice",123,2,3.8};// Designated initializer (since C99)structStudentbob={.name="Bob",.id=246,.semester=1,.gpa=3.9};Structs may also use bit fields to allow fields to share the same storage units, but layouts are implementation-defined.
struct Properties { // ฟิลด์สามฟิลด์สามารถบรรจุได้อย่างกะทัดรัดในหนึ่งไบต์unsigned char visible : 1 ; // a ใช้พื้นที่ 1 บิตunsigned char color : 3 ; // b ใช้พื้นที่ 3 บิตunsigned char size : 4 ; // c ใช้พื้นที่ 4 บิต};โครงสร้างหน่วยความจำของสตรัคเจอร์เป็นเรื่องของการใช้งานในแต่ละภาษาและแพลตฟอร์ม โดยมีข้อจำกัดบางประการ ที่อยู่หน่วยความจำของสมาชิกตัวแรกต้องเหมือนกับที่อยู่ของสตรัคเจอร์เอง สตรัคเจอร์สามารถเริ่มต้นหรือกำหนดค่าโดยใช้ลิเทอรัลแบบผสมได้ ฟังก์ชันอาจส่งคืนสตรัคเจอร์โดยตรง แม้ว่าโดยทั่วไปแล้วจะไม่ค่อยมีประสิทธิภาพในขณะรันไทม์ ตั้งแต่C99 เป็นต้น มา สตรัคเจอร์อาจลงท้ายด้วยสมาชิกอาร์เรย์ที่ยืดหยุ่นได้ด้วย
ฟังก์ชันอาจรับโครงสร้างข้อมูลเป็นพารามิเตอร์แบบส่งค่า แต่การทำเช่นนี้มีค่าใช้จ่ายสูงเนื่องจากต้องคัดลอกโครงสร้างข้อมูลทั้งหมด ในขณะเดียวกัน การส่งผ่านโดยใช้ตัวชี้มักจะเหมาะสมกว่า เนื่องจากทราบขนาดของตัวชี้ (โดยทั่วไปคือ 4 หรือ 8 ไบต์)
#include <stdio.h>// การส่งค่าแบบ pass by value void print_student ( struct Student s ) { printf ( "Name: %s, ID: %d, in semester %d, with GPA: %.2f \n " , s . name , s . id , s . semester , s . gpa ); }// การส่งผ่านด้วยพอยเตอร์void print_student ( struct Student * s ) { printf ( "ชื่อ: %s, รหัสประจำตัว: %d, ภาคการศึกษา %d, เกรดเฉลี่ย: %.2f \n " , s -> name , s -> id , s -> semester , s -> gpa ); }โครงสร้างสามารถประกอบขึ้นจากโครงสร้างอื่นๆ ได้:
struct Date { int year ; int month ; int day ; };struct Birthday { char name [ 50 ]; struct Date dob ; };โครงสร้างข้อมูลที่มีตัวชี้ไปยังโครงสร้างข้อมูลประเภทเดียวกัน มักใช้ในการสร้างโครงสร้างข้อมูลแบบเชื่อมโยง :
struct LinkedList { void * item ; // เก็บรายการปัจจุบันstruct LinkedList * next ; // เก็บรายการถัดไป หรือ NULL ถ้าไม่มีอะไรถัดไป};สหภาพแรงงาน
ประเภทแบบยูเนียน (Union type)เป็นโครงสร้างพิเศษที่อนุญาตให้เข้าถึงบล็อกหน่วยความจำเดียวกันได้โดยการเลือกใช้คำอธิบายประเภทที่แตกต่างกัน
// เก็บค่าจำนวนเต็มหรือค่าทศนิยมunion Number { int i ; float f ; } d ;d.i = 10 ; // ตอนนี้ d เก็บค่า 10 d.f = 3.14f ; // ตอน นี้ d เก็บค่า 3.14 ซึ่ง เขียนทับ ค่า10ในตัวอย่างต่อไปนี้ อาจมีการประกาศการรวมประเภทข้อมูลเพื่อให้สามารถอ่านข้อมูลเดียวกันได้ไม่ว่าจะเป็นจำนวนเต็ม ทศนิยม หรือประเภทอื่นๆ ที่ผู้ใช้กำหนด:
ยูเนียน{ int i ; float f ; struct { unsigned int u ; double d ; } s ; } u ;ขนาดโดยรวมของuคือขนาดของu.sซึ่งก็คือผลรวมของขนาดของu.s.uและu.s.dเนื่องจากsมีขนาดใหญ่กว่าทั้งiและfเมื่อกำหนดค่าให้กับu.iบางส่วนของu.fอาจยังคงอยู่หาก มีขนาด เล็ก u.iกว่าu.f
การอ่านข้อมูลจากสมาชิกสหภาพแรงงานไม่เหมือนกับการหล่อหลอม เพราะคุณค่าของสมาชิกไม่ได้ถูกแปลง แต่เป็นการอ่านข้อมูลเท่านั้น
ตัวชี้ฟังก์ชัน
ตัวชี้ฟังก์ชันช่วยให้สามารถอ้างอิงถึงฟังก์ชันที่มีรูปแบบเฉพาะได้ ตัวอย่างเช่น เพื่อเก็บที่อยู่ของฟังก์ชันมาตรฐานไว้absในตัวแปรmy_int_f:
int ( * my_int_f )( int ) = & abs ; // สามารถละเว้นตัวดำเนินการ & ได้ แต่จะทำให้ชัดเจนว่ามีการใช้ "ที่อยู่ของ" abs ที่นี่ตัวชี้ฟังก์ชันจะถูกเรียกใช้โดยใช้ชื่อเช่นเดียวกับการเรียกใช้ฟังก์ชันทั่วไป
#include <stdio.h> #include <stdlib.h>int ( * my_abs )( int ) = & abs ; int x = -42 ; int abs_of_x = my_abs ( x ); printf ( "abs(%d) = %d \n " , x , abs_of_x );ตัวกำหนดประเภท
ประเภทต่างๆ ที่กล่าวมาข้างต้นสามารถจำแนกเพิ่มเติมได้ด้วยตัวกำหนดคุณสมบัติประเภท (type qualifiers ) ทำให้ได้ประเภทที่มีคุณสมบัติ (qualified type ) ณ ปี 2014 และC11มาตรฐาน C มีตัวกำหนดคุณสมบัติประเภทอยู่สี่แบบ:
const( C89 )volatile( C89 )restrict( ซี99 )_Atomic( C11 ) – ชื่อหลังมีชื่อส่วนตัวเพื่อหลีกเลี่ยงการขัดแย้งกับชื่อผู้ใช้[ 23 ]atomicแต่ สามารถใช้ชื่อทั่วไป ได้หาก<stdatomic.h>มีการรวมส่วนหัวไว้ด้วย
ในconstบรรดาตัวเลือกเหล่านี้ `const` เป็นที่รู้จักและใช้งานมากที่สุด โดยปรากฏอยู่ในไลบรารีมาตรฐานของภาษา Cและพบเจอได้ในการใช้งานภาษา C ที่สำคัญใดๆ ซึ่งต้องเป็นไปตามหลักความถูกต้องของ `const` ตัวกำหนดคุณสมบัติอื่นๆ ส่วนใหญ่ใช้สำหรับการเขียนโปรแกรมระดับต่ำ: ` volatileconst` มีจุดประสงค์เพื่อระงับการเพิ่มประสิทธิภาพของคอมไพเลอร์บนตัวแปรโดยแนะนำว่าตัวแปรนั้นอาจเปลี่ยนแปลงได้ตลอดเวลา `const` restrictบ่งชี้ว่าวัตถุที่ชี้โดยตัวชี้จะถูกเข้าถึงโดยตัวชี้เองเท่านั้น และ ` _Atomicconst` บ่งชี้ว่าวัตถุนั้นเป็น "อะตอมิก" กล่าวคือ การอ่านและการเขียนไม่สามารถแบ่งแยกได้
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ประเภทข้อมูล C
ในภาษา การเขียนโปรแกรม C ชนิดข้อมูล ประกอบด้วยความหมายและลักษณะเฉพาะของการจัดเก็บข้อมูล โดยจะแสดงออกมาในไวยากรณ์ของภาษาในรูปแบบของการประกาศ ตำแหน่งหน่วยความจำ หรือ ตัวแปร...
ประเภทหลัก
ภาษา C มีตัวระบุชนิดข้อมูลทางคณิตศาสตร์พื้นฐานสี่แบบ ได้แก่ char , int , float และ double (รวมถึงชนิดข้อมูลบูลีนด้วย bool ) และตัวดัดแปลง ได้แก่ signed , unsigned , short , และ long...
ประเภทบูลีน
C99 เพิ่ม ชนิดข้อมูลบูลีน (Boolean _Bool ) นอกจากนี้ ส่วนหัวยังกำหนดให้ bool เป็นชื่อเรียกย่อที่สะดวกสำหรับชนิดนี้ และยังมีมาโครสำหรับ true และ false อีก ด้วย _Bool ทำงานคล้ายกับชนิดข้อมูลจำนวนเต็มปกติ โดยมีข้อยกเว้นหนึ่งอย่างคือ การแปลงใดๆ เป็น จะ _Bool...
ประเภทจำนวนเต็มที่แม่นยำระดับบิต
ตั้งแต่ C23 เป็นต้นมา ภาษาอนุญาตให้โปรแกรมเมอร์กำหนดจำนวนเต็มที่มีความกว้างเป็นจำนวนบิตตามอำเภอใจ ประเภทเหล่านั้นระบุเป็น โดยที่ N เป็นนิพจน์ค่าคงที่จำนวนเต็มที่แสดงจำนวนบิต รวมถึงบิตเครื่องหมายสำหรับประเภทที่มีเครื่องหมาย ซึ่งแสดงในรูปแบบสองส่วนเติมเต็ม...