สวัสดีและยินดีต้อนรับกลับ
เนื่องจากเลขคณิตแบบจุดเป็นแนวคิดที่เข้าใจและเข้าใจได้ยาก
ฉันจึงอยากจะยกตัวอย่างสุดท้ายที่แสดงให้เห็นแนวคิดนี้จริงๆ
ซึ่งทำได้ดีมาก
และถ้าคุณเข้าใจตัวอย่างนี้ คุณจะไม่มีปัญหากับเลขคณิตแบบจุด
ตัวอย่างแรกที่ฉันต้องการแสดงให้คุณเห็นคือผลของการเพิ่มค่าจำนวนเต็มให้กับตัวชี้
ดังนั้นเมื่อเราคำนวณพอยน์เตอร์ด้วยการบวก เราจะเห็นว่ามันทำงานอย่างไรในแง่ของที่อยู่
ในโปรแกรมนี้ ทั้งหมดที่ฉันทำคือสร้างสตริง
อาร์เรย์อักขระ เรียกว่าสตริง
จากนั้นฉันก็สร้างตัวชี้อักขระที่เรียกว่า p
ฉันกำลังดูความยาวทั้งหมดของสตริงซึ่งมีหลายอัน
ดังนั้นฉันจะผ่านอาร์เรย์ทั้งหมด
เพียงตั้งชื่อพื้นฐานสำหรับความยาวความแรงของลูปหลายขนาดและหลายขนาด
จากนั้นฉันก็พิมพ์สตริงหรืออักขระจริงแต่ละตัวภายในอาร์เรย์นั้น
และสิ่งที่ฉันทำคือแสดงที่อยู่และที่อยู่ด้วยหมายเลขจริงที่ฉันเพิ่มเข้าไป
ลองดูผลลัพธ์ของสิ่งนี้เพราะผลลัพธ์แสดงให้เห็นตัวอย่างที่ดีของเลขคณิตจุด
ไปที่บล็อกโค้ดและเรียกใช้สิ่งนี้
ดังนั้น เราจึงอยู่ในบล็อคโค้ด ฉันล้างรหัสเล็กน้อย
ฉันใช้ความยาว str ตั้งค่าความยาว strn เพราะมันรวมพิเศษ
และฉันต้องการเรียกใช้สิ่งนี้
เมื่อผมรันสิ่งนี้ สิ่งที่คุณจะสังเกตเห็นก็คือ มันแสดงให้คุณเห็นว่าหน่วยความจำหน้าตาเป็นอย่างไร
และมันแสดงให้คุณเห็นค่าต่างๆ ที่ทำการคำนวณแบบจุด
ดังนั้นถ้าคุณบอกว่า
sub-0 หลายตัว จำไว้ว่า multiple ก็แค่มีสตริง
แต่ถ้าเราดูสิ่งนี้และเราบอกว่าดูที่เนื้อหาอาร์เรย์
ทวีคูณของ 0 คือ a, ทวีคูณของ 1 คือช่องว่างแล้วส่วนที่เหลือเป็นสตริง
นั่นคืออาร์เรย์
ถัดจากนี้เหมือนกับการเพิ่ม 0 ให้กับตัวชี้และยกเลิกการอ้างอิงโดยเพิ่ม
1 และเพิ่ม 2
และจะแสดงให้คุณเห็นว่าคุณสามารถคำนวณตัวชี้ได้อย่างไรโดยพิจารณาจากการอ้างอิงตัวชี้และเพิ่มตัวเลขลงไป
ตัวชี้ บวก เจ็ด dereference ที่คุณได้รับ g
จากนั้นในคอลัมน์ที่สาม ฉันกำลังแสดงที่อยู่จริงให้คุณดูในขณะที่เราเพิ่มขึ้น
ดังนั้นที่อยู่ของแต่ละองค์ประกอบในอาร์เรย์โดยใช้เครื่องหมายและในอาร์เรย์อักขระ
เราจะเห็นที่อยู่ 060feff สำหรับองค์ประกอบ 0 เป็นต้น
จากนั้นเราจะดูที่อยู่ถ้าเราเพิ่มไปยังตัวชี้เองโดยไม่ลดการอ้างอิง
และคุณจะเห็นที่อยู่เรียงกัน
ดังนั้นเราจึงสามารถดูไวยากรณ์เพื่อดูว่าเกิดอะไรขึ้นในแง่ของสิ่งแรกที่เราแสดงจริง
ๆ คือดัชนีในอาร์เรย์ซึ่งเป็นเพียงตัวนับ
จากนั้นเราแสดงเปอร์เซ็นต์ c ซึ่งเป็นอักขระที่อาร์เรย์
สิ่งต่อไปที่เรากำลังแสดงคือการไม่อ้างอิงตัวชี้บวก
I
สิ่งที่เราทำคือแสดง I จากนั้นแสดงค่าอ้างอิงของตัวชี้บวก I
ค่าจริง
ดังนั้นเราจึงแสดงเป็น d เพียงตัวนับจริง
แล้วจุด c คือ dereference ของเรา
ดังนั้น p คือตัวชี้ของเรา
เราแค่บอกว่า p บวก I, เลขคณิตพอยน์เตอร์, แล้วเราตัดการอ้างอิงมันออก
จากนั้นเพื่อให้ได้ที่อยู่ สิ่งที่เราต้องทำเพื่อให้ได้ที่อยู่อาร์เรย์คือบอกแอมแปร์และตัวคูณแล้วตามด้วยดัชนี
ในการรับที่อยู่ของตัวชี้ตรงนี้เป็นอันดับแรก เราแค่พูดว่า
p บวก I เพื่อให้ได้ตัวนับจริง
ซึ่งแสดงให้คุณเห็นว่าเรากำลังเพิ่มค่า
p นั้นอย่างไร เราก็แค่ทำ p บวกเปอร์เซ็นต์
d
แต่มันทำงานได้ดีในการสาธิตวิธีต่างๆ
ที่หน่วยความจำที่เราชี้ไปยังที่อยู่นั้นถูกแสดงจริง ๆ และมันเทียบเท่ากับดัชนีต่างๆ ในอาร์เรย์และพอยน์เตอร์จริงได้อย่างไร
ฉันคิดว่ามันทำงานได้ดี
ฉันต้องการดูตัวอย่างอีกตัวอย่างหนึ่งที่ทำงานได้ดีอีกประการหนึ่งเกี่ยวกับเลขคณิตตัวชี้ด้วย
longs เพราะนี่คือจำนวนเต็ม
ทั้งหมดที่เราต้องทำคือเพิ่มหนึ่งรายการและไปที่ไบต์ถัดไปโดยอัตโนมัติ
เรามาดูกันว่าเราทำอะไรกันบ้าง
ในตัวอย่างนี้ ฉันต้องการจะแสดงให้เห็นว่าคุณสามารถทำสิ่งเดียวกันกับตัวชี้แบบยาวและแบบยาวได้อย่างไร
ด้วยตัวชี้อักขระ มันเป็นเพียงอาร์เรย์อักขระสตริง
แต่ถึงแม้จะเป็นอาร์เรย์แบบยาวซึ่งมีขนาดต่างกัน เราก็ยังสามารถวนซ้ำได้โดยใช้ตัวชี้
และคุณสามารถดูได้ว่าจำนวนไบต์ที่เปลี่ยนแปลงไปจริงเป็นอย่างไร
แม้ว่าเราจะบอกว่าเรามีตัวชี้แบบยาว และเราเพิ่มตัวชี้เข้าไปหนึ่งตัว จริงๆ แล้วเรากำลังเพิ่ม
4 ไบต์เข้าไปเพราะความยาวนั้นใหญ่กว่าเล็กน้อย และเราจะเห็นว่าในตัวอย่างนี้
ทีนี้มาลองรันตัวอย่างนี้ในบล็อคโค้ดกัน
นี่คือตัวอย่างของเรา อีกครั้ง เรามีตัวนับจำนวนเต็ม ตัวนับลูป
เรามีอาร์เรย์ยาว 15l.
เรากำลังระบุ l โดยใส่คำต่อท้าย จากนั้นเราระบุ l ของพวกเขา
longs ของพวกมัน เรามีตัวชี้แบบยาวที่ชี้ไปที่ตัวคูณ
อีกครั้ง เนื่องจากเป็นอาร์เรย์ เราจึงไม่จำเป็นต้องใช้ที่อยู่ของโอเปอเรเตอร์
เราจะผ่านช่วงยาวไปทั้งหมด ในที่นี้เราไม่สามารถใช้ความยาวกวนที่เราต้องใช้ขนาด
และเราต้องหารด้วยแต่ละจุดในอาร์เรย์
ขนาดรวมหารด้วยจุดเดียวในอาร์เรย์ นั่นคือตอนที่เราต้องการกระโดดออกมา
เพราะสิ่งเหล่านี้จะจดจำที่อยู่ของเราที่เพิ่มขึ้นทีละ
4 ไบต์
และอีกครั้งที่เราทำที่นี่คือ เราแค่แสดงทั้งตัวชี้เทียบกับอาร์เรย์
และแสดงให้คุณเห็นว่าพวกมันเกี่ยวข้องกันอย่างไร
จากนั้นเราแสดงจำนวนไบต์ทั้งหมดจริงที่ความยาวอยู่ในระบบของเรา
และนี่ก็แสดงให้เห็นอีกครั้งว่าอาร์เรย์เกี่ยวข้องกับพอยน์เตอร์อย่างไร
ถ้าเรารันสิ่งนี้ เราจะเห็นผลลัพธ์ที่คล้ายกัน
แต่สิ่งที่แตกต่างเล็กน้อยที่นี่คือขนาดที่อยู่
ซึ่งเพิ่มขึ้น 4 ไบต์ เราจะพิมพ์ที่อยู่และตัวชี้
ดังนั้นสำหรับแอดเดรสและพอยน์เตอร์บวก
0 มันจะเท่ากับอาร์เรย์ย่อย 0
ซึ่งก็คือแอดเดรส 6356728
และเพื่อเลี่ยงการอ้างอิงตัวชี้ เราจะได้ค่า 15
ดังนั้น p บวก 0 จะยังเท่ากับอาร์เรย์ย่อย 0
แล้วอีกครั้ง เราทำเช่นเดียวกันสำหรับ p บวกหนึ่ง p บวก 2 และ p บวก
3 ทั้งหมดเทียบเท่ากับจุดที่ถูกต้องในอาร์เรย์สำหรับดัชนี
ที่อยู่จะเพิ่มขึ้น 4 ไบต์ แต่เรายังคงสามารถเพิ่ม 2 และ 3 ได้และเราเห็นว่าค่าเหมือนกัน
แล้วมันก็บอกเราว่าขนาดยาวนี้กินพื้นที่ 4 ไบต์ และนั่นคือสาเหตุที่ที่อยู่เพิ่มขึ้น 4
สิ่งสำคัญที่นี่คือ เรายังสามารถเพิ่มมันเข้าไปได้
และคอมไพเลอร์รู้ว่าต้องไปยังที่อยู่ถัดไป
ดังนั้นไม่ว่าเราจะมีความยาวหรืออักขระหรือชนิดข้อมูลใดที่อยู่ภายในระบบ
การเพิ่มหนึ่งหรือ 2 จะเป็นการเพิ่มจำนวนไบต์ที่ถูกต้อง
อีกตัวอย่างหนึ่งที่ฉันต้องการแสดงให้คุณเห็น
เพราะเลขคณิตของตัวชี้นี้สำคัญมาก และมีประโยชน์มากเมื่อวนซ้ำหรือสำรวจอาร์เรย์ มันทำให้สะอาดขึ้นมาก
และมีประสิทธิภาพมากขึ้น
ดังนั้นฉันหวังว่าสิ่งนี้จะช่วยได้ ขอขอบคุณ.