ความแตกต่างระหว่างตัวแปรและพอยน์เตอร์คืออะไร?


10

การอ่านวิสต์บทความสรุปความแตกต่างในOO และฟังก์ชั่นการเขียนโปรแกรมฉันเจอตัวชี้ฟังก์ชั่น ไม่นานหลังจากที่ฉันเรียนจบสาขาวิทยาศาสตร์คอมพิวเตอร์ (2003) และดังนั้นฉันจึงค้นหาตัวชี้เพื่อฟื้นฟูความทรงจำของฉัน

พอยน์เตอร์เป็นตัวแปรที่มีการอ้างอิงไปยังที่อยู่หน่วยความจำ พวกเขาสามารถพิจารณาให้ชี้ไปยังข้อมูลที่มีอยู่ในที่อยู่หน่วยความจำนั้นหากข้อมูลดังกล่าวมีอยู่ หรือในกรณีในบทความพวกเขาอาจระบุจุดเข้าสู่ส่วนของรหัสและสามารถใช้โทรหารหัสนั้นได้

ทำไมสิ่งนี้จึงแตกต่างจากตัวแปร ตัวแปรคือชื่อสัญลักษณ์สำหรับที่อยู่หน่วยความจำและคอมไพเลอร์จะแทนที่ชื่อด้วยที่อยู่จริง ซึ่งหมายความว่าตัวแปรประกอบด้วยการอ้างอิงไปยังที่ตั้งหน่วยความจำและสามารถพิจารณาให้ชี้ไปยังข้อมูล ณ ที่อยู่นั้นหากมีข้อมูลดังกล่าวอยู่

หากความแตกต่างอยู่ในลักษณะการทำงาน (อาจเป็นตัวชี้ที่ไม่สามารถกำหนดใหม่ในรันไทม์หรือสามารถกำหนดชื่อตัวแปรสัญลักษณ์ไม่ใช่ค่าอื่น ๆ ) ไม่ได้หมายความว่ามันเป็นเพียงตัวแปรประเภทหนึ่งประเภทตัวชี้? ในทำนองเดียวกันตัวแปรที่ประกาศว่าเป็นจำนวนเต็มชนิดจะถูก จำกัด โดยการคอมไพล์ในสิ่งที่สามารถใช้งานได้

ฉันหายไปนี่อะไร


4
ตัวชี้เป็นชนิดที่มีประสิทธิภาพซึ่งการตีความทางความหมายคือเนื้อหาของตัวแปรคือที่อยู่ โปรดทราบว่ามีสองที่อยู่มีที่อยู่ของตัวชี้ (เช่นที่เก็บตัวแปร) และที่อยู่ที่ตัวชี้อ้างอิง (ข้อมูลจริงตามที่อยู่ของตัวแปร) ตัวชี้เป็นประเภทของการอ้างอิง
ลุคแมททีสันเมื่อ

คำตอบ:


8

คำถามของคุณน่าสนใจในหลายวิธีเนื่องจากต้องใช้ความแตกต่างอย่างระมัดระวังสำหรับปัญหาต่างๆ แต่วิสัยทัศน์ของคุณดูเหมือนว่าฉันจะถูกต้องเป็นหลัก ฉันไม่ได้อ่านข้อมูลอ้างอิงของคุณก่อนที่จะเขียนคำตอบส่วนใหญ่เพื่อหลีกเลี่ยงการให้น้ำหนักคำตอบของฉัน

อันดับแรกข้อความของคุณVariables are symbolic names for memory addressesเกือบถูกต้อง แต่สร้างความสับสนให้กับแนวคิดและการนำไปปฏิบัติตามปกติ ตัวแปรเป็นเพียงคอนเทนเนอร์ที่สามารถมีค่าที่สามารถเปลี่ยนแปลงได้ โดยปกติแล้วคอนเทนเนอร์นี้จะถูกนำไปใช้งานบนคอมพิวเตอร์ในฐานะที่เป็นพื้นที่หน่วยความจำซึ่งมีลักษณะและที่อยู่และขนาดเนื่องจากตัวแปรอาจมีวัตถุที่ต้องการการนำเสนอด้วยข้อมูลที่มากหรือน้อย

แต่ฉันจะพิจารณาในมุมมองที่เป็นนามธรรมมากขึ้นเกี่ยวกับความหมายของภาษาที่เป็นอิสระจากเทคนิคการใช้งาน

ดังนั้นตัวแปรจึงเป็นแค่คอนเทนเนอร์จากมุมมองเชิงนามธรรม ภาชนะดังกล่าวไม่จำเป็นต้องมีชื่อ อย่างไรก็ตามภาษามักจะมีตัวแปรที่ตั้งชื่อโดยเชื่อมโยงกับตัวระบุเพื่อให้การใช้งานของตัวแปรสามารถแสดงโดยตัวระบุ ตัวแปรสามารถมีตัวระบุหลายตัวผ่านกลไกนามแฝงต่างๆ ตัวแปรสามารถเป็นส่วนย่อยของตัวแปรที่มีขนาดใหญ่กว่าได้ตัวอย่างคือเซลล์ของตัวแปรอาเรย์ซึ่งสามารถตั้งชื่อได้โดยการระบุตัวแปรอาเรย์และดัชนีของเซลล์

ฉันจงใจใช้คำว่าcontainerที่ค่อนข้างเป็นกลางเพื่อหลีกเลี่ยงการกล่าวคำอื่น ๆ ที่อาจมีความหมายทางเทคนิค จริงๆแล้วมันใกล้เคียงกับแนวคิดของการอ้างอิงที่อธิบายไว้ใน wilipediaซึ่งมักจะสับสนกับที่อยู่หน่วยความจำ ตัวชี้คำนั้นมักเข้าใจกันว่าเป็นที่อยู่หน่วยความจำ แต่ฉันไม่คิดว่ามีความหมายเมื่อพิจารณาภาษาระดับสูงส่วนใหญ่และอาจไม่เหมาะสมในเอกสารการสนทนาที่คุณอ้างถึง (แม้ว่าสามารถใช้ที่อยู่ได้) เนื่องจากไม่เหมาะสม หมายถึงการใช้งานเฉพาะ อย่างไรก็ตามมันเหมาะสำหรับภาษาอย่าง C ซึ่งควรจะใกล้เคียงกับแนวคิดการนำไปปฏิบัติและสถาปัตยกรรมเครื่อง

ที่จริงแล้วถ้าคุณดูที่ตัวแปรหรือค่าที่ระดับการนำไปปฏิบัติอาจมีระบบที่ซับซ้อนหลายอย่างเกี่ยวกับการอ้อมของ "ตัวชี้ระดับเครื่อง" แต่ที่ผู้ใช้มองไม่เห็น (และควรจะ) ดังนั้นมุมมองเชิงนามธรรม ฉันพัฒนาได้ถูกต้อง สำหรับภาษาโปรแกรมส่วนใหญ่ผู้ใช้ไม่ควรกังวลหรือรู้เกี่ยวกับการติดตั้งเนื่องจากการใช้งานอาจแตกต่างกันมากสำหรับภาษาที่กำหนด สิ่งนี้อาจไม่เป็นจริงสำหรับบางภาษาเช่น C ซึ่งใกล้เคียงกับสถาปัตยกรรมของเครื่องเป็นตัวแทนขั้นสูงสำหรับภาษาแอสเซมบลีที่เกือบจะสัมพันธ์โดยตรงกับการเข้ารหัสไบนารีแบบชัดแจ้ง แต่ระดับต่ำเกินไปสำหรับการใช้งานที่สะดวกที่สุด สถานการณ์

สิ่งที่ผู้ใช้ภาษาควรรู้และบางครั้งควรมีค่าน้อยกว่านั้นคือค่าและการดำเนินการที่เกี่ยวข้องที่พวกเขาสามารถมีได้อย่างไรพวกเขาสามารถเชื่อมโยงกับชื่อได้อย่างไรระบบการตั้งชื่อทำงานอย่างไร ชนิดของค่าที่กำหนด ฯลฯ

อีกแนวคิดที่สำคัญคือตัวระบุและการตั้งชื่อ การตั้งชื่อเอนทิตี (ค่า) สามารถทำได้โดยเชื่อมโยงตัวระบุกับค่า (มักจะอยู่ในการประกาศ) แต่ยังสามารถรับค่าได้โดยใช้การดำเนินการกับค่าที่ตั้งชื่ออื่น ชื่อสามารถนำกลับมาใช้ใหม่ได้และมีกฎ (กฎการกำหนดขอบเขต) เพื่อกำหนดสิ่งที่เกี่ยวข้องกับตัวระบุที่กำหนดตามบริบทการใช้งาน นอกจากนี้ยังมีชื่อพิเศษที่เรียกว่า litterals เพื่อตั้งชื่อค่าของบางโดเมนเช่นจำนวนเต็ม (เช่น ) หรือบูลีน (เช่นจริง )612

ความสัมพันธ์ของค่าที่ไม่เปลี่ยนแปลงกับตัวระบุมักเรียกว่าค่าคงที่ Litterals เป็นค่าคงที่ในแง่นั้น

"คอนเทนเนอร์ค่า" สามารถพิจารณาเป็นค่าได้และการเชื่อมโยงกับตัวระบุเป็นตัวแปรในความหมาย "ไร้เดียงสา" ตามปกติที่คุณใช้ ดังนั้นคุณอาจบอกว่าตัวแปรเป็น "ค่าคงที่คอนเทนเนอร์"

ตอนนี้คุณอาจสงสัยว่าอะไรคือความแตกต่างระหว่างการเชื่อมโยงตัวระบุกับค่า (การประกาศค่าคงที่) หรือการกำหนดค่าให้กับตัวแปรเช่นการจัดเก็บค่าในคอนเทนเนอร์ที่กำหนดเป็นค่าคงที่ของคอนเทนเนอร์ โดยพื้นฐานแล้วการประกาศอาจถูกมองว่าเป็นการดำเนินการที่กำหนดสัญกรณ์ที่เชื่อมโยงตัวระบุซึ่งเป็นเอนทิตี syntactic กับค่าบางอย่างซึ่งเป็นเอนทิตี้ของความหมาย การมอบหมายคือการดำเนินการซีแมนติกส์ล้วนๆที่ปรับเปลี่ยนสถานะเช่นแก้ไขค่าของคอนเทนเนอร์ ในบางแง่การประกาศเป็นแนวคิดเมตาที่ไม่มีผลความหมายนอกเหนือจากการให้กลไกการตั้งชื่อ (เช่นวากยสัมพันธ์) สำหรับหน่วยความหมาย

ที่จริงแล้วการมอบหมายเป็นการดำเนินการทางความหมายที่เกิดขึ้นแบบไดนามิกในขณะที่โปรแกรมถูกดำเนินการในขณะที่การประกาศมีลักษณะทางวากยสัมพันธ์มากขึ้นและมักจะถูกตีความในข้อความของโปรแกรมซึ่งเป็นอิสระจากการดำเนินการ นี่คือเหตุผลที่การกำหนดขอบเขตแบบคงที่ (เช่นการกำหนดขอบเขตข้อความ) เป็นวิธีปกติในการเข้าใจความหมายของตัวระบุ

หลังจากทั้งหมดนี้ฉันสามารถพูดได้ว่าค่าตัวชี้เป็นเพียงชื่ออื่นสำหรับคอนเทนเนอร์และตัวแปรพอยน์เตอร์เป็นตัวแปรคอนเทนเนอร์เช่นคอนเทนเนอร์ (ค่าคงที่) ที่สามารถมีคอนเทนเนอร์อื่น (มีข้อ จำกัด ที่เป็นไปได้ในเกมที่บรรจุโดยบางคน ระบบประเภท)

เกี่ยวกับรหัสคุณระบุ [pointers] might indicate the entry point to a section of code and can be used to call that code. จริงๆแล้วมันไม่จริงเลย ส่วนของรหัสมักไม่มีความหมายเพียงอย่างเดียว (จากระดับสูงหรือมุมมองการนำไปใช้) จากมุมมองระดับสูงรหัสมักจะมีตัวระบุและคุณต้องตีความตัวระบุเหล่านี้ในบริบทแบบคงที่ที่พวกเขาถูกประกาศ แต่ในความเป็นจริงแล้วมีการทำซ้ำของบริบทแบบคงที่เหมือนกันเนื่องจากมีการเรียกซ้ำซึ่งเป็นปรากฏการณ์แบบไดนามิก (เวลาทำงาน) และรหัสสามารถดำเนินการในอินสแตนซ์ไดนามิกที่เหมาะสมของบริบทแบบคงที่เท่านั้น นี่เป็นบิตที่ซับซ้อน แต่ผลที่ตามมาก็คือแนวคิดที่เหมาะสมคือการปิดที่เชื่อมโยงส่วนหนึ่งของรหัสและสภาพแวดล้อมที่ตัวระบุจะถูกตีความ การปิดเป็นแนวคิดทางความหมายที่เหมาะสมกล่าวคือเป็นค่าความหมายที่กำหนดได้อย่างถูกต้อง จากนั้นคุณสามารถมีค่าคงที่การปิดตัวแปรการปิด

ฟังก์ชั่นคือการปิดโดยปกติจะมีพารามิเตอร์บางอย่างเพื่อกำหนดหรือเริ่มต้นบางส่วนของหน่วยงาน (ค่าคงที่และตัวแปร)

ฉันข้ามความหลากหลายในการใช้กลไกเหล่านี้

การปิดสามารถใช้เพื่อกำหนดโครงสร้าง OO ในภาษาที่จำเป็นหรือใช้งานได้ ที่จริงแล้วการทำงานในช่วงต้นของสไตล์ OO (อาจเป็นก่อนชื่อ) ก็เป็นเช่นนั้น

บทความที่คุณอ้างอิงซึ่งฉันอ่านอย่างรวดเร็วดูเหมือนจะเป็นเรื่องที่น่าสนใจเขียนโดยบุคคลที่มีความสามารถ แต่อาจไม่ใช่เรื่องง่ายในการอ่านถ้าคุณไม่มีประสบการณ์ที่สำคัญกับภาษาที่หลากหลายและโมเดลการคำนวณพื้นฐาน

แต่จำไว้ว่า: มีหลายสิ่งในสายตาของคนดูตราบใดที่เขายังคงมุมมองที่สอดคล้องกัน มุมมองอาจแตกต่างกัน

สิ่งนี้ตอบคำถามของคุณหรือไม่

PS: นี่เป็นคำตอบที่ยาวนาน หากคุณพิจารณาบางส่วนของมันไม่เพียงพอโปรดระบุให้ชัดเจนว่ามันคืออะไร ขอบคุณ.


ฉันต้องอ่านมันสองสามครั้ง แต่ฉันคิดว่ามันตอบคำถามของฉันใช่ แม้ว่าคำจำกัดความของฉันจะเป็นศูนย์กลางการดำเนินการมากเกินไปความคิดที่ว่าตัวชี้เป็นตัวแปรชนิดหนึ่งโดยเฉพาะดูเหมือนว่าจะแม่นยำเช่น"ค่าตัวชี้เป็นเพียงชื่ออื่นสำหรับคอนเทนเนอร์และตัวแปรตัวชี้เป็นตัวแปรคอนเทนเนอร์" โดยที่ฉันไม่ทำ รับความแตกต่างที่คุณทำอยู่ระหว่างตัวชี้ที่มีที่อยู่ของบล็อกของรหัสและเป็นคอนเทนเนอร์ที่ประกอบด้วยคอนเทนเนอร์ที่ประกอบด้วยการปิด ความแตกต่างระหว่างบริบทคงที่และโปรแกรมในการดำเนินการหรือไม่
NectarSoft

1
@NectarSoft ความแตกต่างระหว่างบล็อคโค้ดและการปิดเท่านั้น สิ่งที่ฉันกำลังพูดก็คือโดยตัวมันเองที่แยกได้จากบริบทใด ๆ บล็อกของรหัสหมายความว่าไม่มีอะไร ถ้าฉันบอกคุณว่า " ถ้า raths mome มีขนาดใหญ่กว่า borogoves แล้ว toves outgrabe " ประโยคนั้นไม่มีความหมายอะไรเลยเพราะคุณพลาดบริบทที่กำหนดแนวคิดเหล่านี้ทั้งหมด บริบทแบบสแตติกนี้มักจะเป็นข้อความที่อยู่ในส่วนของโค้ด ปัญหาคือบริบทสแตติกนี้เองสามารถมีหลายอินสแตนซ์รันไทม์และส่วนของรหัสต้องอ้างถึงหนึ่งในนั้นเท่านั้น
babou

1
@NectarSoft (ต่อ) ดังนั้นค่าปิดคือการเชื่อมโยงของส่วนรหัสและอินสแตนซ์แบบไดนามิกของบริบทแบบคงที่ที่ให้ความหมายกับส่วนนี้ การเชื่อมโยงของส่วนรหัสเดียวกันกับอินสแตนซ์แบบไดนามิกที่แตกต่างกันของบริบทแบบคงที่เดียวกันให้การปิดที่แตกต่างกัน โดยทั่วไปโค้ดของคุณอาจใช้ตัวแปรที่อยู่ในบริบท th แต่มันจะเป็นตัวแปรที่แตกต่างกันสำหรับแต่ละอินสแตนซ์แบบไดนามิกของบริบทแม้ว่าชื่อ (กำหนดไว้แบบคงที่) จะยังคงเหมือนเดิม สิ่งนี้ทำให้ปัญหาชัดเจนขึ้นหรือไม่หรือฉันควรสร้างตัวอย่างในคำตอบ (รูปแบบความคิดเห็นมีข้อ จำกัด )
babou

มันทำให้ปัญหาชัดเจนขึ้นขณะที่ถามคำถามอื่น ๆ ที่ฉันจะใช้เวลาคิด ตัวอย่างเช่นหากต้องการตัวชี้ที่แตกต่างกันสำหรับการปิดแต่ละครั้งดูเหมือนว่าตัวชี้จะกลายเป็นส่วนหนึ่งของบริบทแบบไดนามิกและดังนั้นจึงเป็นของการปิด! ฉันยังสงสัยเกี่ยวกับขอบเขตการปิดและลำดับชั้นการปิดเนื่องจากบริบทเหล่านี้แต่ละรายการที่เกี่ยวข้องกับบล็อกโค้ดแบบคงที่และการอ้างอิงโดยตัวชี้จะจำเป็นต้องเป็นตัวแปรในการปิดของตัวเอง ทั้งหมดนี้อยู่นอกหัวข้อ แต่ฉันจะอ่านและอาจก่อให้เกิดคำถามอื่นเมื่อฉันติดอีกครั้ง
NectarSoft

@NectarSoft ที่จริงแล้ว เมื่อคุณสร้างการปิดคุณพยายาม จำกัด บริบทที่เกี่ยวข้องกับรหัสในสิ่งที่จำเป็นเพื่อให้ความหมายที่ถูกต้องกับรหัสนั้น (มากถึงข้อ จำกัด ในทางปฏิบัติเพื่อหลีกเลี่ยงการจัดการข้อมูลขนาดเล็ก) สิ่งนี้สามารถตัดสินใจได้แบบคงที่
Babou

2

ความแตกต่างคือโดยความหมายและการประยุกต์ใช้ตัวชี้เป็นตัวแปรพิเศษเพื่อเก็บที่อยู่หน่วยความจำของตัวแปรอื่น ในข้อตกลง OO ตัวชี้อาจถูกพิจารณาให้สืบทอดพฤติกรรมของมันจากคลาสทั่วไปที่เรียกว่าตัวแปร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.