ความแตกต่างระหว่างตัวแปรและตำแหน่งหน่วยความจำคืออะไร? [ปิด]


38

เมื่อเร็ว ๆ นี้ฉันพยายามอธิบายพอยน์เตอร์ด้วยวิธีภาพเป็นแฟลชการ์ด

คำถาม 001:นี่คือภาพวาดของตำแหน่งในหน่วยความจำคอมพิวเตอร์ มันเป็นความจริง0x23452หรือไม่ที่อยู่ของมันคือ ทำไม?

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:ใช่เพราะ0x23452อธิบายว่าคอมพิวเตอร์สามารถหาตำแหน่งนี้ได้จากที่ใด


คำถาม 002:จริงหรือไม่ที่ตัวละครbนั้นถูกเก็บไว้ในตำแหน่งหน่วยความจำ0x23452? ทำไม?

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:ไม่เพราะตัวละครaจะถูกเก็บไว้ข้างใน


คำถามที่ 003:มันคือความจริงที่เป็นตัวชี้ที่เก็บไว้ภายในที่ตั้งหน่วยความจำ0x23452? ทำไม?

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:ใช่เพราะที่อยู่ของตำแหน่งหน่วยความจำ0x34501ถูกเก็บไว้ข้างใน


คำถามที่ 004:มันคือความจริงที่เป็นตัวชี้ที่เก็บไว้ภายในที่ตั้งหน่วยความจำ0x23452? ทำไม?

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:ใช่เพราะที่อยู่ของตำแหน่งหน่วยความจำอื่นจะถูกเก็บไว้ข้างใน


ตอนนี้สำหรับส่วนที่ทำให้ฉันกังวล วิศวกรซอฟต์แวร์อธิบายพอยน์เตอร์ให้ฉันเช่นนี้:

ตัวชี้เป็นตัวแปรที่มีค่าเป็นที่อยู่หน่วยความจำของตัวแปรอื่น

จาก FlashCards ทั้งสี่ที่ฉันแสดงให้คุณเห็นทั้งหมดฉันจะกำหนดพอยน์เตอร์ด้วยวิธีที่แตกต่างกันเล็กน้อย:

ตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่น

มันปลอดภัยหรือไม่ที่จะบอกว่าตัวแปรนั้นเหมือนกับตำแหน่งหน่วยความจำหรือไม่?

ถ้าไม่เช่นนั้นใครถูก ความแตกต่างระหว่างตัวแปรและตำแหน่งหน่วยความจำคืออะไร?


37
มีการสันนิษฐานโดยปริยายที่นี่ทุกคนว่าการอ่านภาพเหล่านั้นจะได้รู้ว่าเจตนาของคุณที่เลขฐานสิบหกภายใต้กล่องที่อยู่หน่วยความจำและว่า,a สิ่งอื่น ๆ ที่อยู่ข้างในนั้นคือค่านิยม นั่นอาจดูเหมือนชัดเจนสำหรับคุณ แต่ฉันไม่สะดวกที่จะตอบคำถามเหล่านั้นอย่างเด็ดขาดโดยไม่เห็นว่ามีการกำหนดเขตข้อมูลเหล่านั้นอย่างไร ไม่มีทางรู้ได้เลยว่าในภาพที่สองเป็นตัวละครสตริง (ถ้ามันแตกต่างกัน) หรือชื่อของตัวแปร หากเป็นสตริงแสดงว่าเป็นสตริงด้วยหรือไม่ หรือค่า "null"? 0x23453nilanil
ilkkachu

39
คำถามที่ 1 เป็นคำถามที่ไม่ดี นั่นคือสิ่งที่คุณต้องบอกผู้อ่านก่อนที่พวกเขาจะสามารถตอบคำถามอื่น ๆ ได้ แทนที่จะเป็นคำถามควรให้ข้อมูลแก่ผู้อ่าน: "ในคำถามต่อไปนี้กล่องเป็นตำแหน่งหน่วยความจำและเลขฐานสิบหกด้านล่างเป็นที่อยู่"
17 จาก 26

15
คำถาม 3 ไม่สามารถตอบได้ตามบริบท ไม่มีวิธีบอกระดับไบต์ว่าค่าที่เก็บไว้ในหน่วยความจำถูกตีความ / ใช้ในระดับแอปพลิเคชันอย่างไร
17 จาก 26

6
น่าสังเกต: ทุกสิ่งที่คุณเขียนที่นี่เป็นจริงสำหรับ C หรือ C ++ แต่เป็นเท็จสำหรับภาษาใด ๆ ที่ไม่มีการอ้างอิงตัวชี้ / การอ้างอิงที่ชัดเจน การเปรียบเทียบทั้งหมดของตัวแปรที่เป็นช่องที่ค่าจะถูกแบ่งลงสำหรับภาษา (เช่น Python, Java, หรือ C #, Ruby หรือ JavaScript หรือ JavaScript หรืออื่น ๆ อีกมากมาย) ที่การมอบหมายเพียงทำให้ตัวแปรชี้ไปยังวัตถุโดยไม่คัดลอก และการกลายพันธุ์ของวัตถุนั้นสามารถมองเห็นได้ผ่านตัวแปรทั้งหมดที่ชี้ไป เอกสารของไพ ธ อนใช้การเปรียบเทียบทางเลือกของตัวแปรในขณะที่ nametags แขวนอยู่บนวัตถุด้วยเหตุนี้
Mark Amery

19
BTW และให้อภัยฉันถ้าคุณเข้าใจสิ่งนี้ แต่ดูเหมือนว่านี่อาจเป็นจุดสับสน - สัญกรณ์ "0x23452" นี้เป็นเพียงวิธีแสดงตัวเลขในรูปแบบเลขฐานสิบหกและทำเพื่อความสะดวก แต่มันเป็นเพียงตัวเลข - ส่วนนำหน้า 0x ไม่ได้หมายความว่ามันเป็นตัวชี้สิ่งที่เก็บไว้ในหน่วยความจำนั้นเป็นเพียงตัวเลขที่ไม่มีความหมาย (คุณสามารถติดป้ายตำแหน่งหน่วยความจำด้วยจำนวนเต็มฐานสิบแบบธรรมดา) ความหมาย (เช่นจำนวนที่ควรตีความ) มาจากภาษา - ประเภทของตัวแปร & วิธีการใช้งาน
Filip Milovanović

คำตอบ:


69

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

(แม้ในภาษาแอสเซมบลีเรายังมีความคิดเกี่ยวกับตัวแปร (ตรรกะ) ที่จะไปสู่อัลกอริธึมและเจตนาและตำแหน่งทางกายภาพ (ทางกายภาพ) แม้ว่ามันจะมีการรวมแฟลกในการประกอบมากขึ้น)

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

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

ในแง่หนึ่งตัวแปรเป็นกลไกของนามธรรมสำหรับการแสดงเจตนาของโปรแกรมในขณะที่ตำแหน่งหน่วยความจำเป็นหน่วยงานทางกายภาพของสภาพแวดล้อมการประมวลผลที่ให้การจัดเก็บและการดึง

คำถาม 003: จริงหรือไม่ที่ตัวชี้ถูกเก็บไว้ภายในตำแหน่งหน่วยความจำ 0x23452 ทำไม?

เราไม่สามารถพูดได้อย่างแน่นอน เพียงเพราะมีค่าที่จะใช้เป็นที่อยู่ไม่ได้หมายความว่ามันคือที่อยู่มันอาจเป็นจำนวนเต็ม (ทศนิยม) 144466 เราไม่สามารถตั้งสมมติฐานเกี่ยวกับการตีความค่านิยมเพียง แต่ขึ้นอยู่กับว่าพวกเขาปรากฏตัวเลขอย่างไร

คำถาม 004: จริงหรือไม่ที่ตัวชี้ถูกเก็บไว้ภายในตำแหน่งหน่วยความจำ 0x23452 ทำไม?

นี่เป็นคำถามแปลก ๆ พวกเขาคาดหวังว่าสมมติฐานบางอย่างขึ้นอยู่กับกล่องอย่างไรก็ตามโปรดทราบว่าที่อยู่จะเพิ่มขึ้น 1 สำหรับแต่ละกล่อง ในคอมพิวเตอร์สมัยใหม่ทุกเครื่องนั่นหมายความว่าแต่ละกล่องสามารถเก็บแอดเดรสไบต์ได้เป็นบรรทัดฐานมานานหลายทศวรรษแล้ว อย่างไรก็ตามไบต์มีเพียง 8 บิตและสามารถอยู่ในช่วงตั้งแต่ 0 ถึง 255 (สำหรับค่าที่ไม่ได้ลงนาม); แต่พวกเขาแสดงค่าที่มากกว่าที่เก็บไว้ภายในที่อยู่เหล่านี้อย่างใดอย่างหนึ่งที่น่าสงสัยมาก (สิ่งนี้สามารถใช้งานได้หากนี่เป็นเครื่องที่ใช้คำพูด แต่มันไม่ได้บอกอย่างนั้นและวันนี้มีเครื่องไม่กี่เครื่อง

จาก FlashCards ทั้งสี่ที่ฉันแสดงให้คุณเห็นทั้งหมดฉันจะกำหนดพอยน์เตอร์ด้วยวิธีที่แตกต่างกันเล็กน้อย:

ตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่น

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

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


4
และแม้แต่ไบต์ 8 บิตก็ยังไม่เป็นสากล
Deduplicator

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

4
@JimmyJames ในกรณีของตัวชี้ unrolled-loop ดังนั้นถ้ารหัสของคุณใช้ค่าของตัวนับมันจะต้องโหลดที่ใดที่หนึ่งแต่ (a) สถานที่นั้นอาจเป็นรีจิสเตอร์และ (b) ในหลักการไม่มีเหตุผลว่าทำไมมันจะต้องเป็นสถานที่เดียวกันในการวนซ้ำของการวนซ้ำที่ไม่ได้ควบคุม
โซโลมอนช้า

3
หากลูปกำลังทำอะไรบางอย่างเช่นการคัดลอกอาเรย์ความยาวคงที่sourceไปยังอาร์เรย์ความยาวเท่ากันdestลูปที่เขียนโค้ดfor (int i=0; i<8; ++i) dest[i] = source[i];อาจจะคอมไพล์ลงไปเป็นสิ่งที่เทียบเท่ากับการทำซ้ำdest++ = source++;จำนวนครั้งของแอพพลิเคชั่น ด้วยตัวนับลูปไม่มีหลักฐาน (แม้แต่ในรีจิสเตอร์) และมีเพียงจำนวนครั้งที่บอกคุณเกี่ยวกับเงื่อนไขลูป
dmckee

2
ความแตกต่างค่อนข้างสับสนโดยภาษาเช่น C ซึ่งมีความหมายอยู่ใกล้กับนามธรรมของเครื่องที่มีหน่วยความจำประกอบด้วยสถานที่หมายเลข
Michael Kay

20

มันปลอดภัยหรือไม่ที่จะบอกว่าตัวแปรนั้นเหมือนกับตำแหน่งหน่วยความจำหรือไม่?

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

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

ตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่น

flashcard ชุดนี้สับสนมากไม่เพียง แต่ไม่ผิดเท่านั้น


1
Once a code had been compiled into an executable, there's no longer any variables.นั่นคือสิ่งที่ฉันไม่เห็นด้วยกับเนื้อหา มันถูกต้องที่ตัวแปรของคุณตามที่คุณรู้ (เช่นชื่อนั้น) ไม่มีอยู่อีกต่อไป แต่การใช้ถ้อยคำของคุณดูเหมือนจะแนะนำว่าไฟล์ที่คอมไพล์ได้นั้นใช้หน่วยความจำเท่านั้น ไม่ถูกต้อง ความสามารถในการเรียกใช้งานที่คอมไพล์ แต่ไม่ได้ดำเนินการของคุณไม่มีความคิดใดว่าหน่วยความจำที่อยู่จะถูกใช้เมื่อทำการประมวลผล แนวคิดของตัวแปร (เช่นการอ้างอิงที่ใช้ซ้ำได้กับที่อยู่หน่วยความจำใด ๆ ที่จะถูกกำหนดเมื่อรันไทม์) ยังคงมีอยู่ภายในของปฏิบัติการที่คอมไพล์แล้ว
Flater

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

16

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

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

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


เพื่อให้ตัวอย่างใน C: เมื่อฉันมีอาร์เรย์ 2D int foo[6][7];และฉันเข้าถึงองค์ประกอบของมันด้วยfoo[1][2]แล้วfooเป็นตัวแปรที่ถืออาร์เรย์ เมื่อfooใช้ในบริบทนี้มันจะกลายเป็นตัวชี้ไปยังองค์ประกอบแรกของอาร์เรย์ ตัวชี้นี้ไม่ได้เก็บไว้ในตัวแปรใด ๆ และไม่ได้เก็บไว้ในหน่วยความจำค่าของมันจะถูกสร้างขึ้นภายในการลงทะเบียนของ CPU ที่ใช้แล้วลืมไปแล้ว ในทำนองเดียวกันการแสดงออกfoo[1]จะกลายเป็นตัวชี้อื่นในบริบทนี้ซึ่งอีกครั้งไม่ได้อยู่ในตัวแปรไม่ได้ถูกเก็บไว้ในหน่วยความจำ แต่คำนวณใน CPU ใช้และลืม สามแนวคิดตัวแปร , สถานที่ตั้งของหน่วยความจำและตัวชี้จริงๆสามแนวคิดที่แตกต่าง


Btw ฉันหมายถึงจริงๆ "มีหนึ่งไบต์เสมอที่เก็บไว้ในแต่ละตำแหน่งหน่วยความจำ" นี่ไม่ใช่กรณีในยุคหินของการคำนวณเมื่อห้าสิบปีที่แล้ว แต่มันเป็นความจริงสำหรับฮาร์ดแวร์ทั้งหมดที่ใช้อยู่ในปัจจุบัน เมื่อใดก็ตามที่คุณเก็บค่าในหน่วยความจำที่มีขนาดใหญ่กว่าหนึ่งไบต์คุณกำลังใช้หน่วยความจำต่อเนื่องหลายตำแหน่ง เช่น (สมมติว่ามีการสั่งไบต์ใหญ่ endian) หมายเลข 0x01234567 จะถูกเก็บไว้ในหน่วยความจำเช่น

+------+------+------+------+
| 0x01 | 0x23 | 0x45 | 0x67 |
+------+------+------+------+
    ^      ^      ^      ^
    |      |      |      |
 0x4242 0x4243 0x4244 0x4245

(เครื่อง endian เล็ก ๆ น้อย ๆ เช่นสถาปัตยกรรม X86 จะจัดเก็บไบต์ตามลำดับย้อนกลับ) สิ่งนี้เป็นจริงสำหรับพอยน์เตอร์เช่นกัน: ตัวชี้บนเครื่อง 64 บิตจะถูกเก็บไว้ในแปดไบต์ต่อเนื่องกันโดยมีที่อยู่หน่วยความจำของตนเอง คุณไม่สามารถดูเซลล์หน่วยความจำและพูดว่า: "โอ้นี่คือตัวชี้!" คุณมักจะเห็นเฉพาะไบต์เมื่อคุณมองไปที่หน่วยความจำ


คอมพิวเตอร์รู้ได้อย่างไรว่ากลุ่มของตำแหน่งหน่วยความจำต่อเนื่องเริ่มต้นและสิ้นสุด
progner

6
@progner มันไม่ได้ มันตีความไบต์ในหน่วยความจำตามคำแนะนำที่ได้รับ คำแนะนำเหล่านั้นจะถูกเก็บไว้ในสิ่งใดนอกจากลำดับไบต์เอง สำหรับ CPU ความแตกต่างเพียงอย่างเดียวระหว่างไบต์ที่เก็บคำสั่งไบต์ที่มีอักขระและไบต์ที่เก็บบิตทศนิยมบางจุดเป็นวิธีที่ถูกสั่งให้ใช้ไบต์นี้ หากมีการดึงข้อมูลไบต์เนื่องจากตัวนับโปรแกรมชี้ไปมันจะใช้เป็นคำสั่ง ถ้ามันถูกดึงมาเพราะคำสั่งบอกให้โหลดมันลงใน float register มันจะถูกใช้เป็นข้อมูลทศนิยม
cmaster

7
@progner จริง ๆ แล้วเป็นนวัตกรรมที่สำคัญของสถาปัตยกรรม von-Neuman: ในการจัดเก็บทั้งคำสั่งและข้อมูลในหน่วยความจำเดียวกันช่วยให้คำแนะนำในการเปลี่ยนข้อมูลที่ถูกดำเนินการในภายหลังเป็นคำแนะนำเพิ่มเติม สิ่งนี้ได้รับอนุญาตให้แก้ไขรหัสด้วยตนเอง แต่มันยังอนุญาตให้เคอร์เนลของระบบโหลดบางโปรแกรมลงในหน่วยความจำแล้วบอกให้ CPU ดำเนินการโปรแกรมนั้น ก่อน von-Neuman คอมพิวเตอร์เช่นเครื่อง Zuse จะได้รับคำแนะนำผ่านช่องทางที่เป็นอิสระอย่างเต็มที่จากข้อมูลที่ดำเนินการ
cmaster

5

ให้ฉันมุ่งเน้นไปที่คำถามจริงของคุณ - "ใครถูก?" เมื่อเปรียบเทียบสองข้อความนี้:

  • ตัวชี้เป็นตัวแปรที่มีค่าเป็นที่อยู่หน่วยความจำของตัวแปรอื่น
  • ตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่น

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

ตัวอย่างบางส่วนสำหรับข้อความที่แม่นยำยิ่งขึ้น:

  • "ตัวชี้คือตัวเลขที่แสดงถึงที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำ" หรือ

  • "ตัวแปรตัวชี้เป็นตัวแปรที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำ"

  • "ที่อยู่หน่วยความจำสามารถถือตัวชี้ที่แสดงที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำได้"

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


คุณสามารถเปลี่ยน "อีก" เป็น "a" เพราะตัวชี้สามารถชี้ไปที่ตัวเอง
Pieter B

@PerterB: nitty, nitty ;-) ไม่แน่ใจว่านี่จะทำให้ชัดเจนขึ้นหรือเปล่าเพราะฉันต้องการเพียงเปลี่ยนถ้อยคำต้นฉบับในระดับที่จำเป็นจริงๆเพื่อทำให้พวกเขามีเหตุผล แต่อนิจจาฉันทำการแก้ไข
Doc Brown

เพื่อความเป็นธรรมหากคุณได้รับ nitpicky ที่ "แต่ตัวชี้เป็นเพียงตัวเลข" ไม่ถูกต้องเช่นกันจริง ๆ แล้วตัวชี้เป็นตัวบ่งชี้ refferencing ตัวเลข;) หรืออย่างน้อยเราก็ต้องรู้ภาษาเฉพาะที่จะเข้าไป รายละเอียด
Zaibis

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

2
@Dupuplicator: ถูกต้อง แต่ฉันคิดว่ารูปแบบจิตของตัวชี้เป็นตัวเลขนั้นดีพอสำหรับจุดประสงค์ของคำถามนี้ งั้นมาทำเรื่องง่าย ๆ กันเถอะ
Doc Brown

5

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

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

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

ฉันคิดว่าการเปรียบเทียบที่ดีอาจเป็น URL ซึ่งบอกให้คุณทราบว่าจะหาข้อมูลได้ที่ไหนแต่ไม่ใช่ข้อมูล ได้ยินฉัน:

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

  • ไม่ใช่ทุก ๆ สตริงเป็น URL หรือตั้งใจจะใช้เป็น URL

  • หากคุณพยายามไปที่ URL ปลอมหรือหน้าที่เคยมีอยู่ แต่ถูกลบไปแล้วคุณจะได้รับข้อผิดพลาด

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

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

  • จำนวนหน้าอื่น ๆ สามารถลิงค์ไปยัง URL เดียวกันได้

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

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


every memory location contains an address- ทุกตำแหน่งหน่วยความจำมีที่อยู่ มันไม่ได้มีอยู่ทุกที่ยกเว้นในตัวแปรตัวชี้
Robert Harvey

@RobertHarvey ทุกตำแหน่งของหน่วยความจำ (อย่างน้อยคำ) มีตัวเลขซึ่งอาจตีความได้ว่าเป็นที่อยู่เล็กน้อย ประเด็นก็คือไม่มีอะไรในฮาร์ดแวร์ที่แยกความแตกต่างที่อยู่จากที่ไม่ใช่ที่อยู่
Eevee

2

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

ใน C ตัวดำเนินการ unary ampersand เรียกว่าตัวดำเนินการ "address-of" โปรแกรมเมอร์ C จะไม่ลังเลที่จะบอกว่านิพจน์&xประเมินไปยังที่อยู่ของตัวแปร x แน่นอนว่าพวกเขาหมายถึง "ที่อยู่หน่วยความจำซึ่งเก็บค่าตัวแปร x ไว้" แต่ไม่มีใครสามารถพูดจาหยาบคายได้ ใน C คำว่า "พอยน์เตอร์" มักจะอ้างถึงชนิดข้อมูลของตัวแปรที่ตั้งใจมีที่อยู่หน่วยความจำเป็นค่าของมัน หรือเทียบเท่าชนิดข้อมูลของค่า แต่บางคนก็ใช้ "ตัวชี้" เป็นค่าตัวเอง

ใน Java ตัวแปรทั้งหมดของวัตถุหรือประเภทอาเรย์ทำตัวเหมือนตัวชี้ C (ยกเว้นเลขคณิตตัวชี้) แต่โปรแกรมเมอร์ Java เรียกพวกมันว่าการอ้างอิงไม่ใช่ตัวชี้

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

ตัวชี้เป็นตัวแปรที่มีค่าเป็นที่อยู่หน่วยความจำของตัวแปรอื่น

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

ตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่น

นั่นเป็นวิธีที่แปลกที่จะพูดเพราะต้องใช้คำจำกัดความที่ "หลวม" และไม่เป็นทางการ

มันปลอดภัยหรือไม่ที่จะบอกว่าตัวแปรนั้นเหมือนกับตำแหน่งหน่วยความจำหรือไม่?

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


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

@Dupuplicator ฉันหนึ่งไม่พยายามอวด
gatkin

มาตรฐาน C ยังแยกความแตกต่างอย่างเป็นทางการระหว่างตัวแปรที่ต้องทำตามขั้นตอนของเครื่องนามธรรมที่ "จุดลำดับ" อย่างเคร่งครัดเพื่อความปลอดภัยของเธรดและการดำเนินการระดับต่ำบนฮาร์ดแวร์ที่แมปหน่วยความจำ - และสิ่งที่ไม่สวม t ซึ่งมีอิสระที่จะถูกย้ายเข้าสู่การลงทะเบียน
Davislor

@Davislor: C Standard ใช้คำว่า "object" ในสถานที่ซึ่งข้อกำหนดทางภาษาอื่น ๆ ใช้ "ตัวแปร" รวมทั้งเพื่ออธิบายสิ่งอื่น ๆ ที่ไม่ใช่ตัวแปร การอภิปรายบางอย่างอาจใช้คำว่า "ตัวแปร" ซึ่งไม่เชื่อเรื่องภาษา แต่ด้วยเหตุผลใดก็ตามที่มาตรฐานขาดคำที่จะแยกแยะความแตกต่างระหว่างการจัดสรรการจัดสรร (ตัวแปร) จากชื่อของวัตถุอื่น ๆ เช่นการจัดสรรแบบซ้อน (สมาชิกสมาชิก struct / union) โดยตัวชี้การลงทะเบียน "ตัวแปร" เป็นคำที่ไม่เป็นทางการ แต่มาตรฐานไม่ได้ใช้
supercat

@supercat ไม่ถูกต้อง มาตรฐาน C11 ใช้คำว่า "แปรปรวน" มากกว่าหนึ่งร้อยครั้งซึ่งมีหลายสิบคำนามเช่น "การเข้าถึงตัวแปรเริ่มต้นพร้อมกันได้แม้ผ่านการปฏิบัติการปรมาณูถือเป็นการแข่งขันข้อมูล"
Davislor

1

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

คำสั่งตัวชี้คือตำแหน่งหน่วยความจำที่มีค่าเป็นที่อยู่หน่วยความจำของตำแหน่งหน่วยความจำอื่นไม่ถูกต้อง ค่าของตัวชี้ไม่จำเป็นต้องเก็บไว้ในตำแหน่งหน่วยความจำและเป็นที่ถกเถียงกันอยู่ว่าถ้าตัวชี้ต้องชี้ไปยังตำแหน่งหน่วยความจำขึ้นอยู่กับคำจำกัดความที่ตั้งใจของ "หน่วยความจำ"

ความแตกต่างระหว่างตัวแปรและตำแหน่งหน่วยความจำคืออะไร

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


0

คำตอบนี้เน้นที่ C และ C ++ ดูเหมือนจะเหมาะสมเนื่องจากคำถามของคุณเกี่ยวข้องกับพอยน์เตอร์ซึ่งเป็นส่วนสำคัญของ C / C ++ มากกว่าภาษาอื่น ๆ โพสต์นี้ส่วนใหญ่จะใช้กับภาษาที่คอมไพล์แล้วส่วนใหญ่โดยไม่มีเวลาทำงานที่ซับซ้อน (เช่น Pascal หรือ Ada แต่ไม่เหมือนกับ Java หรือ C #)

คำตอบที่ดีให้แล้วเน้นว่าตัวแปรเป็นภาษาสร้างในระดับนามธรรมมากกว่าหน่วยความจำกายภาพ ฉันต้องการเน้นว่าสิ่งที่เป็นนามธรรมนี้มีเหตุผลและระบบที่แน่นอนสำหรับมัน:

สิ่งที่เป็นนามธรรมส่วนใหญ่ประกอบด้วยการใช้ชื่อแทนที่อยู่ที่แท้จริง

แนวคิดหลักคือตัวแปรเป็นชื่อหมายเลขอ้างอิงสำหรับวัตถุที่พิมพ์ วัตถุใน C / C ++ มักจะอยู่ในหน่วยความจำ จากนั้นภาษาจะเพิ่มสิ่งที่เกี่ยวข้องกับการจัดการอายุการใช้งานและการจัดการข้อมูลสำหรับการแปลงประเภท แนวคิดของตัวแปรมีความเป็นนามธรรมมากกว่าที่อยู่จริงเพราะเราไม่สนใจค่าตัวเลขของที่อยู่หรือตำแหน่งที่แน่นอนของฟังก์ชันในหน่วยความจำ เราเพียงแค่ตั้งชื่อพวกเขาและต่อมาพวกเขาตามชื่อและระบบคอมไพเลอร์, linker และรันไทม์จะดูแลรายละเอียดที่น่ากลัว

และอย่าแสร้งว่า C / C ++ เป็นหน่วยความจำที่ไม่เชื่อเรื่องพระเจ้า: หลังจากนั้นตัวดำเนินการแอดเดรสที่ใช้งานได้ในระดับสากล ใช่จริงคุณไม่สามารถรับแอดเดรสของตัวแปร C ในคลาสหน่วยเก็บข้อมูลรีจิสเตอร์ แต่เมื่อไหร่ที่คุณใช้อันสุดท้าย? มันเป็นข้อยกเว้นพิเศษสำหรับแนวคิดทั่วไปไม่ใช่การเลิกจ้างขายส่งของการโต้แย้ง กฎทั่วไปคือตรงกันข้ามที่อยู่ของตัวแปรบังคับให้คอมไพเลอร์จริง ๆ สร้างวัตถุในหน่วยความจำแม้ว่ามันจะไม่ทำเช่นนั้น (เช่นค่าคงที่) แนวคิด "named handle" ยังเป็นกระบวนทัศน์ที่ดีสำหรับการอ้างอิง C ++: การอ้างอิงเป็นเพียงชื่ออื่นสำหรับวัตถุเดียวกัน

เมื่อฉันเขียนแอสเซมเบลอร์สำหรับ 68k เป็นเรื่องดีที่ได้เห็นว่าคุณสามารถใช้ชื่อตัวแปรเป็นออฟเซ็ตเพื่อจัดการกับการลงทะเบียน (และคุณสามารถใช้ชื่อของตัวแปรที่ประกาศregisterแทนชื่อลงทะเบียนโลหะเปลือย!) สำหรับคอมไพเลอร์ตัวแปรคืออ็อฟเซ็ตแอดเดรสคงที่ หากต้องการย้ำ: ตัวแปรมีชื่อจัดการโดยปกติสำหรับวัตถุในหน่วยความจำ


พอยน์เตอร์เป็นส่วนพื้นฐานของ C #, Java, JS และภาษาอื่น ๆ ด้วย การโทรหาพวกเขาต่างกันจะไม่เปลี่ยนแปลงแม้ว่าจะเป็นการประชาสัมพันธ์ที่ดี
Deduplicator

@Dupuplicator :-) Good ol 'Tony ...
Peter - Reinstate Monica

0

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

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

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

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

การใช้&โอเปอเรเตอร์กับตัวแปรจะให้ตัวชี้ที่ห่อหุ้มที่อยู่และประเภทของมัน การใช้ unary *หรือ[]โอเปอเรเตอร์กับตัวชี้จะทำให้บิตของกล่องจดหมายเริ่มต้นที่ที่อยู่ในแค็ปซูลที่จะตีความหรือตั้งค่าในลักษณะที่เหมาะสมกับประเภทที่ห่อหุ้ม


ดูเหมือนว่าคุณกำลังคิดคำถามอยู่
Robert Harvey

0

ฉันมางานปาร์ตี้สายนี้ แต่ฉันอดไม่ได้ที่จะใส่ 2 เซนต์

ในช่วงเวลาเหล่านี้ความแตกต่างระหว่างค่าที่เก็บไว้ในตำแหน่งหน่วยความจำเหล่านี้คืออะไร

เวลา 1

ป้อนคำอธิบายรูปภาพที่นี่

เวลา 2

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบที่ถูกต้อง: ไม่มีอะไร พวกเขาทั้งหมดมีค่าเหมือนกันที่นำเสนอด้วยการตีความที่แตกต่างกันของความหมายของพวกเขา

ฉันจะรู้ได้อย่างไร เพราะฉันเป็นคนที่ทำสิ่งนี้ขึ้นมา คุณยังไม่รู้จริงๆ

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

ยกตัวอย่างเช่นค่าที่นี่เหมือนกัน แต่คุณจะรู้ว่าการที่จะเป็นจริงถ้าคุณมีความถูกต้องเมื่อคุณถือว่าASCIIเข้ารหัสตัวอักษร / UTF-8 เป็นวิธีการที่ผมได้เป็นคนแรกแทนที่จะพูดEBCDIC และคุณต้องคิดด้วยว่าอันที่สองคือนิพจน์เลขฐานสิบหกของค่าตัวเลขที่เก็บไว้ในตำแหน่งหน่วยความจำเหล่านั้นซึ่งอาจเป็นตัวชี้ไปยังที่อยู่อื่นแทนที่จะบอกการอ้างอิงถึงสตริงที่เกิดขึ้นเริ่มต้นด้วย "0x" : P

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

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


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

@Dupuplicator True ที่มักจะทำให้ผมคิดว่าค ++ 's แปลหล่อ บิตเดียวกันเห็นวิธีที่แตกต่าง
candied_orange

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