‫สวัสดีและยินดีต้อนรับ.
‫ในการบรรยายนี้ เราจะเรียนรู้เกี่ยวกับการอ้างอิงและทางเลือกแทนตัวชี้ และเราจะมาดูกันว่าทำไมมันถึงแตกต่างกัน
‫เหตุใดเราจึงอาจต้องการใช้
‫มาดำดิ่งกันดู
‫เช่นเดียวกับพอยน์เตอร์ มีแนวคิดที่เกี่ยวข้องกันมากที่เรียกว่าการอ้างอิง
‫ตอนนี้ทั้งพอยน์เตอร์และการอ้างอิงเป็นเพียงที่อยู่หน่วยความจำเท่านั้น
‫ทั้งคู่เก็บข้อมูลอ้างอิงถึงตำแหน่งที่สามารถพบตัวแปรอื่นได้ และด้วยวิธีนี้จึงมีความคล้ายคลึงกันอย่างไม่น่าเชื่อ
‫ความแตกต่างระหว่างทั้งสองนั้นขึ้นอยู่กับว่าสามารถมอบหมายใหม่ได้หรือไม่
‫โดยพื้นฐานแล้ว พวกเขาสามารถชี้ไปยังที่อยู่อื่นหลังจากสร้างครั้งแรกได้หรือไม่
‫ในกรณีของตัวชี้คำตอบคือใช่
‫คุณสามารถเปลี่ยนตัวชี้ให้ชี้ไปยังที่อยู่หน่วยความจำใหม่ ตัวแสดงใหม่ องค์ประกอบใหม่ได้ทุกเมื่อที่คุณต้องการ
‫ตราบใดที่มีประเภทที่ถูกต้อง
‫ในทางกลับกัน การอ้างอิงสามารถตั้งค่าได้เพียงครั้งเดียวเมื่อคุณสร้างการอ้างอิงไปยังตัวแปรอื่นในครั้งแรก
‫จะไม่สามารถเปลี่ยนแปลงได้อีก
‫และนี่คือคุณลักษณะด้านความปลอดภัยเนื่องจากตัวแปรชี้ตำแหน่งใหม่อาจนำไปสู่ปัญหาที่ตัวแปรเหล่านั้นอาจหายไปหรือตำแหน่งที่คุณตั้งค่าตัวชี้นั้นเป็นค่าว่าง
‫null pointer เป็นตัวชี้ที่ชี้ไปที่ไม่มีอะไรเลย และการพยายามทำสิ่งต่าง ๆ ด้วยตัวชี้ที่ตั้งค่าให้ไม่มีอะไรสามารถทำให้เครื่องยนต์ของคุณพังได้
‫ซึ่งไม่ใช่ผลลัพธ์ในอุดมคติที่มีการอ้างอิงเพราะคุณต้องให้ค่าแก่พวกเขาในครั้งแรกที่คุณ สร้างพวกเขา
‫ไม่สามารถเป็นโมฆะได้ ดังนั้นคุณจึงไม่สามารถทำให้ตัวชี้ null ขัดข้องได้
‫เรามาเริ่มดูที่ไวยากรณ์ที่เกี่ยวข้องกัน
‫ดังนั้นเมื่อคุณเข้าถึงเนื้อหาด้วยพอยน์เตอร์ คุณต้องใช้ไวยากรณ์พิเศษบางอย่าง
‫คุณต้องวางดาวนี้ไว้ข้างหน้าพอยน์เตอร์เพื่อให้แน่ใจว่าคุณได้รับค่าในพอยน์เตอร์ ไม่ใช่ที่อยู่หน่วยความจำที่มีข้อมูลอ้างอิง
‫เพราะคุณไม่จำเป็นต้องเก็บที่อยู่หน่วยความจำจริงๆ
‫คุณสามารถใช้ตัวแปรราวกับว่ามันเป็นตัวแปรที่มันชี้ไป
‫คุณไม่จำเป็นต้องใช้ไวยากรณ์พิเศษใดๆ
‫ขณะนี้มีการเข้าถึงที่อยู่ ดังนั้นด้วยพอยน์เตอร์ คุณจะได้รับที่อยู่โดยอัตโนมัติ
‫เมื่อคุณใช้ตัวแปรที่มีการอ้างอิง คุณต้องใช้ไวยากรณ์พิเศษ
‫ในการทำเช่นนั้น คุณต้องใช้ที่อยู่ของโอเปอเรเตอร์และคุณจะได้รับที่อยู่เดียวกันกับตัวแปรดั้งเดิม
‫แล้วมีการเปลี่ยนที่อยู่ด้วยตัวชี้
‫เราพบว่าคุณสามารถกำหนดที่อยู่และใช้ที่อยู่ของโอเปอเรเตอร์เพื่อทำข้อมูลอ้างอิงได้
‫ไม่อนุญาต ดังนั้นจึงไม่มีไวยากรณ์
‫และสุดท้าย จะเป็นอย่างไรถ้าเราต้องการเปลี่ยนค่าที่เราชี้ไป ไม่ใช่ที่อยู่ แต่เป็นค่าจริงที่เก็บอยู่ที่ที่อยู่นั้น
‫ด้วยคำแนะนำที่คุณต้องใช้ไวยากรณ์พิเศษอีกครั้ง
‫เราต้องใส่ดาวนั้นแล้วมอบหมายอะไรบางอย่าง
‫ดังนั้นตัวชี้นักแสดงที่คุณกำหนดให้กับตัวชี้นักแสดงดาวที่มีการอ้างอิงอีกครั้งเพราะคุณไม่สามารถเปลี่ยนที่อยู่จริงได้
‫คุณไม่จำเป็นต้องมีไวยากรณ์เพิ่มเติมใดๆ
‫เราสามารถวางไวยากรณ์พิเศษและเพียงแค่มีการอ้างอิงนักแสดงเท่ากับ
‫ตัวแสดงหมายความว่าคุณกำลังเขียนทับค่าในตำแหน่งที่ชี้ไปยังตำแหน่ง
‫นั่นเป็นทฤษฎีเล็กน้อย
‫มาดูตัวอย่างจริงกันเถอะ
‫ดังนั้นถ้าเรามีทุ่นลอยที่อาจเก็บความเสียหายที่ทำกับเราในเกมและในนั้นเราจะจัดเก็บความเสียหายปัจจุบันเป็นศูนย์
‫ไม่มีใครทำอันตรายใด ๆ กับเรา
‫ตอนนี้ เราอาจต้องการสร้างการอ้างอิงถึงสิ่งนี้ แทนที่จะคัดลอกไปรอบๆ เราอาจต้องการส่งผ่านไปยังฟังก์ชัน
‫แต่ไม่มีการเปลี่ยนแปลงจริงๆ
‫วิธีที่เราสามารถทำได้คือการมีทุ่นแล้วใส่เครื่องหมายและหลังทุ่น
‫และเครื่องหมายบอกว่านี่คือการอ้างอิงถึงทุ่น
‫มันไม่ใช่โฟลตใหม่เอง ไม่ได้จัดสรรหน่วยความจำโฟลตใด ๆ
‫มันแค่จัดสรรหน่วยความจำตัวชี้
‫และเราสามารถเรียกสิ่งนี้ว่าการอ้างอิงความเสียหาย และเราสามารถตั้งค่าให้เท่ากับความเสียหายได้
‫เราไม่จำเป็นต้องใช้ที่อยู่หรือทำอะไรแบบนั้น
‫มันรู้โดยอัตโนมัติว่านี่คือข้อมูลอ้างอิงและนี่คือตัวแปร
‫ดังนั้นสิ่งที่คุณพยายามจะทำในที่นี้คือตั้งค่าการอ้างอิงไปยังตัวแปรนั้น
‫และแน่นอนว่า ถ้าเราไปและคุณเข้าสู่ระบบ เราสามารถพิมพ์สิ่งนี้ราวกับว่ามันเป็นเพียงทุ่นปกติ ดังนั้นเราสามารถพูดได้ว่าเครื่องหมายทวิภาคเสียหายและเปอร์เซ็นต์
‫F แล้วที่นี่เราสามารถพิมพ์อ้างอิงความเสียหายได้
‫เราไม่ต้องการรูปแบบพิเศษใดๆ
‫เราสามารถใช้ได้เหมือนกับตัวแปรทั่วไป
‫ไปต่อกันที่ Hit play หลังจากคอมไพล์แล้ว ดูบันทึกการส่งออกของเราและแน่ใจว่าความเสียหายจะออกมาที่ศูนย์ซึ่งเป็นค่าที่เราตั้งไว้
‫แต่นั่นไม่จำเป็นต้องพิสูจน์ว่าฉันยังไม่ได้คัดลอกตัวแปรดั้งเดิมนั้น
‫สมมติว่าคุณลองเปลี่ยนค่าและดูว่าเกิดอะไรขึ้น
‫ดังนั้นใช้ค่าอ้างอิง, ค่าอ้างอิงถึงค่าเสียหายเพื่อตั้งค่าใหม่แล้วพิมพ์ค่าเดิมออกมาเพื่อให้ค่าเดิมอยู่ถัดจากค่าอ้างอิงและได้ดู
‫พวกเขาเหมือนกันหรือแตกต่างกันหรือไม่?
‫คุณเปลี่ยนการอ้างอิงเท่านั้น แต่มันเปลี่ยนต้นฉบับด้วยหรือไม่
‫เพราะนั่นจะหมายความว่าทั้งสองเป็นตัวแปรเดียวกัน
‫หยุดวิดีโอชั่วคราวและไปกันเลย
‫ตกลง.
‫ยินดีต้อนรับกลับ.
‫เลยลองมาแทงกันดู
‫ดังนั้นเพื่อเปลี่ยนการอ้างอิงตอนนี้ เราจะทำความเสียหายอ้างอิงเท่ากับ
‫และครั้งนี้ฉันจะบอกว่าเราทำดาเมจได้ห้าครั้งแล้ว และสังเกตว่าฉันไม่จำเป็นต้องใช้ไวยากรณ์พิเศษใดๆ
‫เลย
‫ไม่ใช่การชี้จุดอ้างอิงใหม่เนื่องจากเราได้ประกาศและตั้งค่าการอ้างอิงในบรรทัดแรกนั้นเมื่อมีการสร้าง
‫เราไม่สามารถทำมันได้อีก
‫ตอนนี้เราสามารถตั้งค่าได้
‫สิ่งที่ผมทำได้ตอนนี้คือเราได้รับความเสียหาย ผู้อ้างอิงอยู่ในบันทึก
‫เรามาใส่ความเสียหายและเปอร์เซ็นต์ f ให้กับสตริงเดียวกันนั้นแล้วส่งความเสียหายที่นี่เช่นกัน
‫แล้วเราจะรวบรวมมาให้ชมกันครับ
‫มาเล่นกันเถอะ เข้าไปในบันทึกการส่งออกของเรา และนั่นเองครับ มันพิมพ์การอ้างอิงความเสียหายและความเสียหาย
‫เนื่องจากทั้งคู่มีค่าใหม่ที่เราตั้งค่าเป็นห้า
‫โดยพื้นฐานแล้ว สิ่งที่เรามีตรงนี้คือตัวแปรสองตัวที่ชี้ไปยังหน่วยความจำชิ้นเดียวกัน
‫คุณเกือบจะพูดได้ว่ามันเป็นตัวแปรเดียวกัน แต่มีชื่อต่างกัน
‫ดังนั้นสิ่งนี้จึงมีประโยชน์ที่ไม่จำเป็นต้องคัดลอก เช่นเดียวกับตัวชี้ แต่มันก็มีประโยชน์มากกว่านั้นอีกมากเพราะใช้งานง่ายกว่ามาก
‫เราไม่ต้องการรูปแบบเพิ่มเติมทั้งหมด และยังปลอดภัยกว่าที่จะใช้
‫ตราบใดที่เราไม่จำเป็นต้องชี้อะไรอีก โดยทั่วไปแล้วการใช้ข้อมูลอ้างอิงจะดีกว่า
‫ตอนนี้ มาทบทวนกันสั้นๆ เกี่ยวกับสัญลักษณ์บางตัวที่เราใช้กันที่นี่ เพราะอาจทำให้สับสนได้เล็กน้อย
‫มีการใช้กันอย่างแพร่หลายใน C ++
‫แอมเพอร์แซนด์และสัญลักษณ์รูปดาว มาดูกันดีกว่าในบริบทและความหมายของมัน
‫เมื่อเราใช้พวกมัน ดังนั้นเมื่อเราใช้มันในนิพจน์ นี่คือตัวอย่างโค้ดบางส่วน
‫คุณอาจเห็นดาวอยู่ข้างหน้าตัวแปร
‫คุณอาจเห็นเครื่องหมายและนำหน้าตัวแปร
‫สิ่งนี้หมายความว่า?
‫ด้วยสัญลักษณ์รูปดาว ไวยากรณ์ของการวางไว้ข้างหน้าตัวแปรหมายความว่าเราได้รับเนื้อหาที่ตัวชี้นักแสดงในขณะนี้ด้วยเครื่องหมายและ
‫หากคุณใส่เครื่องหมายแอมเพอร์แซนด์ไว้หน้าตัวแปรหรือนำหน้าการอ้างอิงตัวแปร
‫แสดงว่าได้รับที่อยู่ของตัวแปรนั้น
‫กำลังรับที่อยู่ของนักแสดงหรือที่อยู่ตามการอ้างอิง
‫เมื่อเราประกาศ เรากำลังใช้มันในรูปแบบของตัวแปร ดาวและเครื่องหมายและมีความหมายตรงกันข้ามเกือบ
‫ดังนั้นดาวจึงหมายความว่านี่คือตัวชี้ไปยังนักแสดงหน้าใหม่และเครื่องหมายและหมายความว่านี่คือการอ้างอิงถึงนักแสดงหน้าใหม่
‫จำไว้ว่ามีชุดของความหมายที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ไม่ว่าคุณจะใช้กับตัวแปรในนิพจน์หรือว่าคุณกำลังใช้ในประเภทที่ประกาศตัวแปรหรือไม่
‫ฉันจะไม่ลงรายละเอียดมากเกินไป แต่เพื่อเพิ่มการดูถูกการบาดเจ็บ สิ่งเหล่านี้สามารถมีความหมายอื่นในบริบทอื่น
‫ๆ ที่เครื่องหมายและอาจหมายถึงฉลาดเล็กน้อย และดาวดังที่เราได้เห็นแล้วสามารถ ใช้กับสตริงในบันทึก
‫U
‫ดังนั้นนี่ไม่ใช่ความหมายทั้งหมดของสัญลักษณ์ทั้งสองนี้ แต่เป็นความหมายที่สำคัญเกือบทั้งหมดที่อ้างถึงตัวชี้และการอ้างอิง
‫สิ่งที่ดี
‫ดังนั้น เราจึงได้เรียนรู้เกี่ยวกับพอยน์เตอร์ ข้อมูลอ้างอิง ความสัมพันธ์ระหว่างกัน ความแตกต่าง
‫และเหตุผลที่เราอาจต้องการใช้
‫เจอกันใหม่ตอนหน้าค่ะ