ความแปลกประหลาดของภาษา C สามารถอธิบายได้ด้วยวิธีการทำงานของคอมพิวเตอร์เมื่อถูกออกแบบมา มีหน่วยความจำในการเก็บข้อมูลจำนวน จำกัด ดังนั้นมันสำคัญมากที่จะลดขนาดของไฟล์ซอร์สโค้ดเอง การฝึกการเขียนโปรแกรมย้อนกลับไปในยุค 70 และ 80 คือเพื่อให้แน่ใจว่าซอร์สโค้ดมีอักขระไม่กี่ตัวที่เป็นไปได้
แน่นอนว่ามันไร้สาระวันนี้ด้วยพื้นที่เก็บข้อมูลไม่ จำกัด บนฮาร์ดไดรฟ์ แต่มันเป็นส่วนหนึ่งของเหตุผลว่าทำไม C มีไวยากรณ์แปลก ๆ โดยทั่วไป
เกี่ยวกับพอยน์เตอร์ของอาร์เรย์โดยเฉพาะตัวอย่างที่สองของคุณควรเป็นint (*p)[10];
(ใช่ซินแท็คซ์สับสนมาก) ฉันอาจจะอ่านว่าเป็น "int pointer to array สิบ" ... ซึ่งค่อนข้างสมเหตุสมผล หากไม่ใช่สำหรับวงเล็บคอมไพเลอร์จะตีความว่ามันเป็นอาร์เรย์ของสิบพอยน์เตอร์แทนซึ่งจะทำให้การประกาศมีความหมายที่แตกต่างกันโดยสิ้นเชิง
เนื่องจากพอยน์เตอร์ของอาเรย์และพอยน์เตอร์ของฟังก์ชั่นทั้งคู่มีไวยากรณ์ค่อนข้างคลุมเครือใน C สิ่งที่สมเหตุสมผลที่ต้องทำคือพิมพ์ความแปลกประหลาดออกไป อาจจะเป็นเช่นนี้:
ตัวอย่างชัดเจน:
int func (int (*arr_ptr)[10])
{
return 0;
}
int main()
{
int array[10];
int (*arr_ptr)[10] = &array;
int (*func_ptr)(int(*)[10]) = &func;
func_ptr(arr_ptr);
}
ตัวอย่างที่ไม่ชัดเจนที่เทียบเท่า:
typedef int array_t[10];
typedef int (*funcptr_t)(array_t*);
int func (array_t* arr_ptr)
{
return 0;
}
int main()
{
int array[10];
array_t* arr_ptr = &array; /* non-obscure array pointer */
funcptr_t func_ptr = &func; /* non-obscure function pointer */
func_ptr(arr_ptr);
}
สิ่งต่าง ๆ จะมีความชัดเจนยิ่งขึ้นหากคุณกำลังติดต่อกับพอยน์เตอร์ของฟังก์ชัน หรือสิ่งที่คลุมเครือที่สุดของพวกเขาทั้งหมด: ฟังก์ชั่นส่งคืนพอยน์เตอร์ของฟังก์ชั่น หากคุณไม่ได้ใช้ typedefs สำหรับสิ่งต่าง ๆ คุณจะเสียสติอย่างรวดเร็ว