ผลต่างระหว่างรุ่นของ "ภาษาซี"

เนื้อหาที่ลบ เนื้อหาที่เพิ่ม
Potapt (คุย | ส่วนร่วม)
ไม่มีความย่อการแก้ไข
ไม่มีความย่อการแก้ไข
ป้ายระบุ: แก้ไขจากอุปกรณ์เคลื่อนที่ แก้ไขจากเว็บสำหรับอุปกรณ์เคลื่อนที่
บรรทัด 301:
 
ภาษาซี99 ได้แนะนำ "แถวลำดับความยาวแปรได้" เพิ่มเข้ามา แต่ก็ยังมีปัญหาบางประการที่เหมือนกับปัญหาแถวลำดับของภาษาซี
 
=== ความใช้แทนกันได้ระหว่างตัวชี้และแถวลำดับ ===
คุณลักษณะเด่นชัดของภาษาซี (ซึ่งอาจทำให้สับสนด้วย) คือการปฏิบัติต่อแถวลำดับและตัวชี้ สัญกรณ์แถวลำดับ <code>x[i]</code> สามารถใช้กับตัวชี้ <code>x</code> ได้ โดยแปลความหมายว่าเป็นการเข้าถึงวัตถุตัวที่ <code>i + 1</code> ของวัตถุข้อมูลที่อยู่ติดกันถัดจากตำแหน่งที่ <code>x</code> ชี้อยู่ ซึ่งถือว่าเป็นสมาชิกตัวแรกของแถวลำดับ (<code>x[0]</code>)
 
<code>x[i]</code> มีความหมายเทียบเท่า <code>*(x + i)</code> ตามรูปแบบ และเนื่องจากชนิดตัวแปรของตัวชี้เป็นที่ทราบขณะแปล ตำแหน่ง <code>x + i</code> ที่ชี้ไปมิได้หมายความว่าจากตำแหน่ง <code>x</code> แล้วเพิ่มไปอีก <code>i</code> ไบต์ แต่หมายถึงเพิ่มไปอีก (<code>i</code> คูณด้วยขนาดของสมาชิกที่ตำแหน่ง <code>x</code>) ขนาดของสมาชิกนี้ได้มาจากการใช้ตัวดำเนินการ <code>sizeof</code> บนสมาชิกที่อ้างอิงกลับตัวใดตัวหนึ่งของ <code>x</code> ดังเช่น <code>n = sizeof *x</code> หรือ <code>n = sizeof x[0]</code>
 
นอกจากนี้ในบริบทส่วนใหญ่ของนิพจน์ ชื่อของแถวลำดับจะถูกแปลงเป็นตัวชี้ที่ชี้ไปยังสมาชิกตัวแรกของแถวลำดับนั้น สิ่งนี้บอกเป็นนัยว่าแถวลำดับจะไม่ถูกคัดลอกข้อมูลไปทั้งหมดเมื่อนำไปตั้งชื่ออาร์กิวเมนต์ของฟังก์ชัน แต่จะมีเพียงแค่ตำแหน่งของสมาชิกตัวแรกเท่านั้นที่ส่งผ่านไป ดังนั้นถึงแม้ว่าการเรียกใช้ฟังก์ชันในภาษาซีจะตีความว่า[[ส่งโดยให้ค่า]] (pass-by-value) แต่แถวลำดับนั้น[[ส่งโดยอ้างอิง]] (pass-by-reference) ในทางปฏิบัติ
 
จำนวนสมาชิกของแถวลำดับ <code>x</code> ที่ได้ประกาศไว้แล้ว สามารถคำนวณได้จาก <code>sizeof x / sizeof x[0]</code>
 
การสาธิตอย่างหนึ่งที่น่าสนใจต่อความใช้แทนกันได้ระหว่างตัวชี้และแถวลำดับแสดงไว้ด้านล่าง การกำหนดค่าทั้งสี่มีความหมายเทียบเท่ากันและเป็นรหัสที่ใช้งานได้ในภาษาซี
<source lang="text">
/* x เป็นแถวลำดับหรือตัวชี้, i เป็นจำนวนเต็ม */
 
x[i] = 1; /* เทียบเท่ากับ *(x + i) */
*(x + i) = 1;
*(i + x) = 1;
i[x] = 1; /* เทียบเท่ากับ *(i + x) */
</source>
แม้ว่าการกำหนดค่าทั้งสี่เทียบเท่ากัน แต่มีเพียงแบบแรกเท่านั้นที่แสดงรูปแบบการลงรหัสที่ดี กรณีอื่นอาจพบได้ใน[[การประกวดรหัสภาษาซียุ่งเหยิงนานาชาติ|รหัสภาษาซีที่ยุ่งเหยิง]]
 
ถึงอย่างไรก็ตามแถวลำดับและตัวชี้ก็ยังมีจุดที่แตกต่างแม้ว่ามันจะเทียบเท่ากัน ตัวชี้ไปยังสมาชิกตัวแรกซึ่งแปลงมาจากแถวลำดับ ไม่มีเนื้อที่เก็บข้อมูลตำแหน่งของมันเอง ต่างจากตัวแปรตัวชี้ซึ่งมี เมื่อเป็นเช่นนั้นแล้วสิ่งที่แถวลำดับ "ชี้ไป" จึงไม่สามารถเปลี่ยนแปลงได้ และไม่สามารถกำหนดค่าใหม่ให้กับตัวแปรแถวลำดับ (ค่าต่าง ๆ ของแถวลำดับอาจคัดลอกได้ โดยใช้ฟังก์ชัน <code>memcpy</code> เป็นต้น)
 
== การจัดการหน่วยความจำ ==
เข้าถึงจาก "https://th.wikipedia.org/wiki/ภาษาซี"