ความเห็นส่วนตัวของฉันคือภาพที่มีลูกศรชี้ไปทางนี้หรือทำให้ตัวชี้ยากขึ้นที่จะเข้าใจ มันทำให้พวกมันดูเหมือนสิ่งที่เป็นนามธรรมและลึกลับ พวกเขาจะไม่.
เหมือนทุกสิ่งทุกอย่างในเครื่องคอมพิวเตอร์ของตัวชี้เป็นตัวเลข ชื่อ "ตัวชี้" เป็นเพียงวิธีแฟนซีในการพูดว่า "ตัวแปรที่มีที่อยู่"
ดังนั้นให้ฉันกระตุ้นสิ่งต่าง ๆ โดยอธิบายว่าคอมพิวเตอร์ใช้งานได้จริง
เรามีint
มันมีชื่อi
และค่า 5 นี้ถูกเก็บไว้ในหน่วยความจำ เช่นเดียวกับทุกสิ่งที่เก็บไว้ในหน่วยความจำต้องมีที่อยู่หรือเราจะไม่สามารถค้นหาได้ ให้บอกว่าi
จบลงที่ที่อยู่ 0x12345678 และเพื่อนของมันj
ด้วยค่า 6 จบลงหลังจากนั้น สมมติว่า CPU แบบ 32 บิตโดยที่ int คือ 4 ไบต์และตัวชี้เป็น 4 ไบต์จากนั้นตัวแปรจะถูกเก็บไว้ในหน่วยความจำกายภาพเช่นนี้
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
ตอนนี้เราต้องการที่จะชี้ไปที่ตัวแปรเหล่านี้ เราสร้างตัวชี้ไปยัง int, และหนึ่งint* ip1
int* ip2
เช่นเดียวกับทุกสิ่งในคอมพิวเตอร์ตัวแปรตัวชี้เหล่านี้จะถูกจัดสรรไว้ในหน่วยความจำเช่นกัน j
ให้ถือว่าพวกเขาจบลงที่อยู่ติดกันต่อไปในหน่วยความจำได้ทันทีหลังจากที่ เราตั้งตัวชี้ที่จะมีที่อยู่ของตัวแปรที่จัดสรรไว้ก่อนหน้านี้: ip1=&i;
( "คัดลอกที่อยู่ของฉันเข้าไปใน IP1") ip2=&j
และ เกิดอะไรขึ้นระหว่างบรรทัดคือ:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
ดังนั้นสิ่งที่เราได้รับก็คือบางส่วนของหน่วยความจำ 4 ไบต์ที่มีตัวเลข ไม่มีลูกศรลึกลับหรือเวทย์มนตร์ใด ๆ ในสายตา
ในความเป็นจริงเพียงแค่มองการถ่ายโอนข้อมูลหน่วยความจำเราไม่สามารถบอกได้ว่าที่อยู่ 0x12345680 มีหรือint
int*
ความแตกต่างคือวิธีที่โปรแกรมของเราเลือกใช้เนื้อหาที่เก็บไว้ตามที่อยู่นี้ (หน้าที่ของโปรแกรมของเราคือการบอกซีพียูว่าจะทำอย่างไรกับตัวเลขเหล่านี้)
int** ipp = &ip1;
แล้วเรายังเพิ่มระดับของความร้ายอีกด้วย อีกครั้งเราเพิ่งได้รับความทรงจำอันมากมาย:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
รูปแบบดูเหมือนคุ้นเคย อีกอันของ 4 ไบต์ที่บรรจุตัวเลข
ตอนนี้ถ้าเรามีการถ่ายโอนข้อมูลหน่วยความจำของแรมตัวน้อยข้างต้นเราสามารถตรวจสอบด้วยตนเองที่จุดพอยน์เตอร์เหล่านี้ เราดูสิ่งที่เก็บไว้ตามที่อยู่ของipp
ตัวแปรและค้นหาเนื้อหา 0x12345680 ซึ่งแน่นอนว่าเป็นที่อยู่ที่ip1
จัดเก็บ เราสามารถไปที่ที่อยู่นั้นตรวจสอบเนื้อหาที่นั่นและค้นหาที่อยู่i
แล้วในที่สุดเราก็ไปที่ที่อยู่นั้นและค้นหาหมายเลข 5
ดังนั้นถ้าเรานำเนื้อหาของ ipp *ipp
เราจะได้ที่อยู่ของตัวแปรพip1
อยน์เตอร์ โดยการเขียน*ipp=ip2
เราคัดลอก IP2 เข้า IP1 ip1=ip2
ก็จะเทียบเท่ากับ ไม่ว่าในกรณีใดเราจะได้รับ
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(ตัวอย่างเหล่านี้มอบให้กับ CPU endian ขนาดใหญ่)
ipp
เมื่อกำหนดมันดังนั้นคำถามของคุณเสร็จสมบูรณ์ ;-)