การประกาศครั้งแรกบอกคอมไพเลอร์ที่someArray
มีความยาวอย่างน้อย 100 องค์ประกอบ สามารถใช้สำหรับการปรับให้เหมาะสม ยกตัวอย่างเช่นมันก็หมายความว่าจะไม่someArray
NULL
โปรดทราบว่ามาตรฐาน C ไม่ต้องการให้คอมไพเลอร์วินิจฉัยเมื่อการเรียกใช้ฟังก์ชันไม่เป็นไปตามข้อกำหนดเหล่านี้ (กล่าวคือเป็นพฤติกรรมที่ไม่ได้กำหนดความเงียบ)
การประกาศครั้งที่สองเป็นการประกาศsomeArray
(ไม่ใช่someArray
องค์ประกอบ!) ในฐานะ const เช่นคุณไม่สามารถเขียนsomeArray=someOtherArray
ได้ char * const someArray
มันเป็นเช่นเดียวกับถ้าพารามิเตอร์ได้
ไวยากรณ์นี้สามารถใช้งานได้เฉพาะภายในสุด[]
ของอาร์เรย์เครื่องมือประกาศในรายการพารามิเตอร์ฟังก์ชัน มันจะไม่สมเหตุสมผลในบริบทอื่น
ข้อความมาตรฐานซึ่งครอบคลุมทั้งสองกรณีข้างต้นอยู่ใน C11 6.7.6.3/7 (คือ 6.7.5.3/7 ใน C99):
การประกาศพารามิเตอร์เป็น '' array of type '' จะถูกปรับเป็น '' ตัวชี้ที่มีคุณสมบัติเป็นประเภท '' โดยที่ qualifier ประเภท (ถ้ามี) เป็นพารามิเตอร์ที่ระบุภายใน[
และมา]
ของประเภทอาร์เรย์ หากคำหลักแบบสแตติกปรากฏขึ้นภายใน[
และที่มา]
ของประเภทอาเรย์ดังนั้นสำหรับการเรียกใช้ฟังก์ชั่นแต่ละครั้งค่าของการโต้แย้งที่แท้จริงจะต้องให้การเข้าถึงองค์ประกอบแรกของอาร์เรย์ที่มีองค์ประกอบอย่างน้อยที่สุดตามที่ระบุโดย การแสดงออกขนาด
int foo(struct bar [static 1]);
แทนint foo(struct bar *);
ลายเซ็นสำหรับฟังก์ชันที่ไม่ยอมรับพอยน์เตอร์ NULL หรือไม่ (ฉันรู้ว่า gcc มีไวยากรณ์ที่ไม่เป็นทางเลือกอื่นในการติดธงทำหน้าที่ดังกล่าวเพื่อให้ผู้แปลสามารถให้คำเตือน .. )