สวัสดีและยินดีต้อนรับกลับ
ในการบรรยายนี้ ฉันต้องการพูดคุยเกี่ยวกับกรณีการใช้งานสำหรับพอยน์เตอร์
เมื่อเราจะใช้พวกมันว่าเราจะใช้งานอย่างไร เรารู้วิธีสร้างมันขึ้นมา
ประกาศและกำหนดพวกเขา
เรารู้วิธีกำหนดที่อยู่ของตัวแปรที่มีอยู่ให้กับตัวแปรโดยใช้ที่อยู่ของตัวดำเนินการ
และเรารู้วิธียกเลิกการอ้างอิง
วิธีรับค่าที่ตัวชี้ชี้ไป
ตอนนี้เราจะเริ่มใช้งานได้อย่างไร
ดังนั้น c จึงมีการดำเนินการพื้นฐานหลายอย่างที่คุณสามารถดำเนินการกับพอยน์เตอร์ได้
คุณสามารถกำหนดที่อยู่ให้กับตัวชี้ที่เราได้เรียนรู้ไปแล้ว
นี่คือตัวแปรที่มีอยู่ซึ่งตัวแปรมีที่อยู่
และคุณแค่ดูที่แอดเดรสของตัวแปรนั้นโดยใช้แอดเดรสของโอเปอเรเตอร์
และเราก็มีจุดนั้น เราสามารถกำหนดพอยน์เตอร์ที่มีอยู่ให้กับตัวชี้อื่นได้
นั่นคือ 2 วิธีที่คุณสามารถกำหนดที่อยู่ให้กับตัวชี้
จึงสามารถเป็นชื่ออาร์เรย์ได้ด้วยตัวเอง
เรายังไม่ได้พูดถึงอาร์เรย์ แต่เมื่อคุณกำหนดการเพิ่มให้กับพอยน์เตอร์
สิ่งที่คุณต้องทำคือระบุชื่อ คุณไม่จำเป็นต้องใช้ที่อยู่ของโอเปอเรเตอร์
จนถึงตอนนี้ เราเพิ่งเน้นไปที่การใช้ตัวแปรที่มีอยู่และส่งต่อที่อยู่ของตัวแปรเอง
แต่มีกล่าวถึง 3 วิธีที่คุณสามารถทำได้
คุณยังสามารถยกเลิกการอ้างอิงตัวชี้ เราเพิ่งรู้ว่านั่นคือที่ที่คุณใช้ เครื่องหมายดอกจันตัวดำเนินการทางอ้อม
สิ่งนี้จะให้ค่าที่เก็บไว้ในตัวชี้แก่คุณ ตัวชี้ค่าของตัวชี้ซึ่งเป็นที่อยู่ที่ชี้ไปเพียงแค่ใช้สิ่งนั้น
คุณยังสามารถใช้ที่อยู่ตัวชี้
นี่คือที่อยู่ที่แท้จริงของตัวชี้เมื่อคุณสร้างตัวชี้ตำแหน่งที่เก็บตัวชี้ไว้
คุณสามารถใช้ที่อยู่ที่ฉันมีโอเปอเรเตอร์บนตัวชี้นั้นได้เช่นกัน
และคุณยังสามารถใช้เลขคณิตตัวชี้ได้อีกด้วย เราจะมีการบรรยายแยกต่างหากในเรื่องนี้
นี่คือที่ที่คุณสามารถใช้ตัวดำเนินการบวกและลบเพื่อเพิ่มจำนวนเต็มให้กับตัวชี้หรือลบจำนวนเต็มออกจากตัวชี้
และสิ่งนี้ช่วยให้คุณมีสัญกรณ์เฉพาะและช่วยให้คุณข้ามไปมาในหน่วยความจำได้เร็วขึ้น
โดยเฉพาะถ้าคุณใช้อาร์เรย์
สิ่งที่คุณทำตามปกติคือเมื่อคุณเพิ่มจำนวนเต็มให้กับตัวชี้โดยใช้ตัวดำเนินการบวก
มันจะตั้งค่าที่อยู่ของตัวชี้นั้นขึ้นเป็นจำนวนไบต์
หากคุณลบตัวเลขออกจากตัวชี้
มันจะตั้งค่าที่อยู่นั้นเป็นลบด้วยจำนวนไบต์ที่แน่นอน
คุณยังสามารถเพิ่มการลดลงได้หนึ่งรายการ
และคุณจะเห็นว่านี่เป็นเรื่องปกติมากเมื่อเราใช้ในอาร์เรย์
ดังนั้นเมื่อคุณอยู่ในอาร์เรย์และต้องการย้ายไปยังองค์ประกอบถัดไปแทนที่จะใช้ดัชนี
คุณสามารถใช้ตัวชี้และเพิ่มทีละรายการได้
หากคุณต้องการย้ายไปยังองค์ประกอบก่อนหน้าแทนที่จะใช้ดัชนี คุณสามารถลดค่าโดยชี้ไปที่องค์ประกอบหนึ่งได้
เลขคณิตของพอยน์เตอร์ เราจะพูดถึงกันโดยเฉพาะ แต่นั่นเป็นสิ่งที่คุณสามารถทำได้กับพอยน์เตอร์
และอีกครั้ง เป็นสัญกรณ์พิเศษที่ช่วยให้คุณเคลื่อนที่ไปมาได้อย่างรวดเร็วในหน่วยความจำ
มีประสิทธิภาพมากขึ้น
นอกจากนี้คุณยังสามารถค้นหาความแตกต่างระหว่าง 2 พอยน์เตอร์
ดังนั้นถ้าคุณมีพอยน์เตอร์ 2 ตัวและองค์ประกอบอยู่ในอาร์เรย์เดียวกัน คุณอาจต้องการค้นหาว่าพวกมันอยู่ห่างกันแค่ไหน
องค์ประกอบ คุณสามารถลบพวกมันได้
นี่จะเป็นความแตกต่างของ
2 พอยน์เตอร์และ ดังนั้น หากคุณเป็นดัชนี 5 แล้วคุณมีจุดตัวชี้ในดัชนี
5 คุณมีจุดชี้ไปที่จุดชี้ไปที่ดัชนี 15 อีกตัวหนึ่ง คุณสามารถลบพวกมันได้
และนั่นจะทำให้คุณได้องค์ประกอบที่พวกมันอยู่ห่างออกไป เพราะมันจะเป็น
ที่อยู่ฐานสิบหกลบด้วยที่อยู่ฐานสิบหกอื่นโดยสมมติว่าอาร์เรย์ในหน่วยความจำต่อเนื่องซึ่งเป็นที่อยู่นั้นจะแสดงว่าห่างกันเท่าใด
คุณสามารถใช้ตัวดำเนินการเชิงสัมพันธ์เพื่อเปรียบเทียบค่าของพอยน์เตอร์ 2 ตัว
พอยน์เตอร์ต้องเป็นชนิดเดียวกัน ดังนั้นหากทั้งคู่เป็นจำนวนเต็มชี้ ทั้งคู่จะต้องเป็นชนิดเดียวกัน
นี่เป็นเพียงการบอกคุณว่าที่อยู่นั้นมากกว่าหรือน้อยกว่า
อีกครั้ง คุณสามารถระบุได้ว่าคุณอยู่ในส่วนใดของอาร์เรย์
นอกจากนี้ยังมีการลบ 2 รูปแบบ
ผมเพิ่งพูดถึงการลบ โดยคุณสามารถเอาตัวชี้หนึ่งตัวมาลบออกจากตัวชี้อีกตัวหนึ่ง
ซึ่งคุณจะได้ตัวชี้
หรือคุณสามารถลบตัวชี้ตัวหนึ่งออกจากจำนวนเต็ม
ซึ่งจะให้ตัวชี้แก่คุณ
ดังนั้นให้ลบตัวชี้ตัวหนึ่งออกจากตัวชี้ตัวอื่นเพื่อรับจำนวนเต็มหรือลบจำนวนเต็มออกจากตัวชี้เพื่อให้ได้ตัวชี้
นั่นคือ 2 กรณี
ดังนั้นเราจะจำไว้ว่าเราจะยกตัวอย่างเพิ่มเติม
โปรดใช้ความระมัดระวังเมื่อคุณใช้การเพิ่มขึ้นหรือลดลงของพอยน์เตอร์และทำให้อาร์เรย์อยู่นอกขอบเขต
สิ่งที่คุณทำกับเลขคณิตพอยน์เตอร์ส่วนใหญ่ก็คือเมื่อคุณทำงานกับอาร์เรย์
เพราะอีกครั้งมันช่วยให้คุณเคลื่อนไหวได้อย่างรวดเร็ว มันคือ syntax ง่ายๆ
แต่อย่าลืมว่าอาร์เรย์มีข้อผิดพลาดเกินขอบเขต
ดังนั้นถ้าคุณเพิ่มมากเกินไป คุณจะเกินขอบเขตในอาร์เรย์
หากคุณลดลงมากเกินไป
คุณจะมีอันเดอร์ขอบเขต คุณจะเป็นจำนวนลบ
คอมพิวเตอร์เองจะไม่ติดตามว่าตัวชี้ยังคงชี้ไปที่องค์ประกอบอาร์เรย์หรือไม่
ดังนั้นการใช้จุดเลขคณิตในอาร์เรย์ คุณจึงต้องระวัง
หากคุณต้องการใช้พอยน์เตอร์ในนิพจน์ คุณก็สามารถทำได้เช่นกัน
ดังนั้นเราจึงพูดถึงเรื่องนี้ก่อนหน้านี้เล็กน้อย และเรายกเลิกการอ้างอิงตัวชี้ และเราเพิ่ม
15 เข้าไป ฉันคิดว่าเราได้ 20
ดังนั้นค่าของตัวชี้ pi สามารถใช้ในนิพจน์ทางคณิตศาสตร์ได้
ดังนั้น หากตัวแปรถูกกำหนดให้เป็นประเภทตัวชี้ไปยังจำนวนเต็ม
ตัวแปรนั้นจะถูกประเมินโดยใช้กฎของเลขคณิตจำนวนเต็ม
และเราแสดงให้เห็นด้วยความเคารพ ดังนั้นหากคุณมีตัวแปรและคุณมีพอยน์เตอร์
ให้กำหนดค่าเริ่มต้นให้เป็นค่าว่าง จากนั้นคุณเซ็นชื่อให้พอยน์เตอร์ของคุณเป็นแอดเดรสของตัวแปรนั้น
คุณก็บอกได้ว่า star pnumber บวก เท่ากับ 25
จำไว้ว่า star pnumber กำลังรับค่าที่ชี้ไป
สิ่งที่ทำคือมันบอกว่าค่าของ pnumber
เท่ากับค่า pnumber บวก 25
ค่าจะเท่ากับ 35
สิ่งนี้ไม่ได้เปลี่ยนสิ่งที่ชี้ไปเพราะเราใช้ดอกจัน จึงไม่เปลี่ยนที่อยู่ที่เรากำลังชี้ไป
ไม่ได้เปลี่ยนที่อยู่เองเพราะเราไม่มีที่อยู่ของโอเปอเรเตอร์
เรากำลังเปลี่ยนค่าที่มันชี้ไป
ดังนั้น การเพิ่มค่าของตัวแปรตัวเลขขึ้นเป็น 25 ดาวแสดงว่าคุณกำลังถามถึงเนื้อหาที่ตัวแปรที่เรียกว่า
pnumber ชี้ไป
ถ้าตัวชี้ชี้ไปที่ตัวแปร x ตัวชี้นั้นถูกกำหนดให้เป็นตัวชี้ไปยังชนิดข้อมูลเดียวกับ
x
ดังนั้น หากคุณสร้างตัวชี้จุดสิ้นสุดตัวชี้แบบลอย คุณจะมีที่อยู่ของประเภทข้อมูลที่เป็นจำนวนจริงหรือเป็น
int ได้เท่านั้น ขึ้นอยู่กับว่าคุณประกาศตัวใด
ดังนั้นการใช้ตัวดำเนินการทางอ้อมในนิพจน์จึงเหมือนกับการใช้
x ในนิพจน์เดียวกัน
ทั้งหมดที่กล่าวมาคือถ้าคุณใช้ float หรือ int และคุณใช้ตัวดำเนินการทางอ้อม
คุณไม่สนใจมัน คุณสามารถทำทุกอย่างที่ทำได้ถ้าคุณมี float
อยู่ในนั้น ไม่ว่าจะชี้ไปที่อะไร
ตัวแปรที่กำหนดเป็นตัวชี้ไปยัง int สามารถเก็บที่อยู่ของตัวแปรประเภทใดก็ได้
เรารู้ว่า
ดังนั้นค่า int เท่ากับ 999 เราสามารถกำหนด int นั้นให้กับ pnumber
ตราบใดที่ pnumber เป็นตัวชี้ไปยัง int จากนั้นเราก็เพิ่มเข้าไปได้
คำสั่งจะดำเนินการกับค่าตัวแปรใหม่และค่าเนื้อหาใหม่จะเป็น
1024
Pnumber ชี้ไปที่ค่า
ที่อยู่ของค่า ดังนั้น หากคุณเปลี่ยนตัวชี้สิ่งที่ชี้ไปที่ค่า
คุณจะต้องเปลี่ยนค่าของค่าตัวแปรนี้
ดังนั้น จำไว้ว่านี่คือแนวคิดของการเปลี่ยนตัวแปรในจุดเดียวของตัวชี้
และคุณกำลังเปลี่ยนตัวแปรหลายตัว
ตัวชี้สามารถมีที่อยู่ของตัวแปรประเภทใดก็ได้ตามความเหมาะสม
ดังนั้น คุณสามารถใช้ตัวแปรพอยน์เตอร์ตัวเดียวเพื่อเปลี่ยนค่าของตัวแปรต่างๆ
มากมาย หากมี ints หรือ doubles หรือ floats ตราบใดที่เป็นประเภทที่เข้ากันได้กับประเภทตัวชี้
คุณสามารถเปลี่ยนค่านั้นได้ คุณไม่สามารถเปลี่ยนค่า pnumbers
หาก pnumber ชี้ไปที่ float และค่าเป็นจำนวนเต็ม
คุณจะไม่สามารถทำอย่างนั้นได้ คุณจะมีข้อผิดพลาดในการคอมไพล์
ตัวอย่างอื่นที่นี่ ที่นี่เราจะแสดงวิธีรับที่อยู่ของตัวแปรบางตัว
ในหลักนี้
เรากำลังคิดเลขคณิตตัวชี้บนนิพจน์จริง
ดังนั้นเราจึงไม่ได้ทำอะไรกับอาร์เรย์ ดังนั้นเราจึงไม่เพิ่มหรือลดพอยน์เตอร์ในนั้น
เรากำลังลดค่าลง ดังนั้นเราจึงมี
num1 และ num2 แบบยาว 2 แบบ จากนั้นเราก็มีตัวชี้แบบ long เราเริ่มต้นให้เป็น null
เรากำหนดที่อยู่ของ num1 ให้กับ pnum ตัวชี้ของเรา
แล้วเรากำหนดค่าของ pnum ให้กับ L
นั่นหมายความว่า num1 จะเป็น 2l
ถ้าเราเพิ่ม num2 ตอนนี้ num2 ยังไม่ได้ทำอะไรเลย
ดังนั้นค่าของ pnum คือ 2l นั่นหมายความว่าค่าของ num1 คือ 2l
L เป็นเพียงคำต่อท้ายเพื่อแสดงว่ามันยาว
หากตอนนี้เราเพิ่มค่า num2 แบบยาว มันคือ
0l มันจะเป็น 1l
ถ้าเราบอกว่า num2 บวก เท่ากับ
star pnum, pnum คือ 2l, มันจะเท่ากับ
1l บวก 2l, num2 จะเท่ากับ 3l
แล้วถ้าเรากำหนดแอดเดรสของ num2 ให้กับ pnum
ตอนนี้ pnum จะเท่ากับแอดเดรสของ num2
ถ้าเราเพิ่ม pnum สิ่งที่เราชี้ไป
เราจะมี 4l
และเราจะดูสิ่งนี้ในบล็อคที่เย็น แต่ฉันจะอธิบายให้คุณฟัง
Num1 จะเท่ากับ 2l
Num2 จะเท่ากับมันชี้ไปที่
pnum
Pnum's 3l ฉันคิดว่ามันจะเป็น 3l
Pnum จะเป็น 3l แล้ว pneum บวก num2 จะเท่ากับ
6l
ลองดูว่าฉันพูดถูกไหม ผ่านสิ่งนี้ในบล็อคโค้ด
ดังนั้น เราจึงอยู่ในกลุ่มของโค้ด พยายามดำเนินการด้วยตนเอง แต่ตอนนี้
เราต้องการดูว่าเราคิดถูกหรือไม่ ลองใช้ดีบักเกอร์กัน
เราจะใส่สิ่งนี้ไว้ตรงนี้ และเราจะเห็นว่าเมื่อเราดำเนินการตามโปรแกรมว่าค่าต่างๆ เปลี่ยนแปลงไปอย่างไร
มาสร้างสิ่งนี้กันเถอะ เรามาดีบักกัน
นี่จะเริ่มต้นขึ้นและจะหยุดที่บรรทัดที่ 10
และถ้าเราเปิดหน้าต่างนาฬิกาขึ้นมา ซึ่งเราสามารถทำได้โดยไปที่การดีบักในนาฬิกาที่ใช้หน้าต่าง
นาฬิกา เราจะเห็นค่าต่างๆ ที่เกิดขึ้น
ตอนนี้
num1 เป็นศูนย์ num2 เป็นศูนย์ pnum ชี้ไปที่ null
นั่นเป็นสาเหตุที่ 0x0
เพราะเรารู้ว่า null แทน 0 ใน pnumber
และเราสามารถใช้สิ่งนั้นเมื่อเราเปรียบเทียบมันในคำสั่ง if
ดังนั้นหลังจากที่เรารันบรรทัดที่ 10 ตอนนี้ pnum ควรมีที่อยู่เป็น num1
งั้นเราข้ามไปกันเถอะ
ตอนนี้ pnum มีที่อยู่จริง 0x60ff08
หลังจากที่เราดำเนินการบรรทัดที่ 11 เราจะบอกว่าค่า pnum เท่ากับ 2l และเราจะไม่เห็นสิ่งใดในหน้าต่างดูสำหรับสิ่งนั้น
แต่ให้ดำเนินการต่อไป
pnum ยังมีที่อยู่เดิม
ตอนนี้เปลี่ยน Num1 เนื่องจาก pnum มีที่อยู่ของ
num1 และเราเปลี่ยนมัน
ตอนนี้ num1 คือ 2 ในบรรทัดที่ 12 เราจะเพิ่ม num2
num2 ก็จะกลายเป็น 1l
มันจะเป็น 1 ที่อยู่ปุ้มยังเหมือนเดิม
ตอนนี้เราจะบวก num2 ไม่ว่า
pnum คืออะไร Pnum จำได้ว่าชี้ไปที่
num1 ดังนั้น num2 ควรเป็น 3
จากนั้นเราไปที่ 14, num2 คือ 3, num1 ยังคงเป็น 2
ตอนนี้ในบรรทัดที่ 15 เราจะกำหนดที่อยู่ใหม่ของ
num2 ให้ pnum หลังจากนี้ เราจะไม่เป็น
0x60ff08 อีกต่อไป
เราจะเป็น 060ff04
ดังนั้นตอนนี้หากเราเพิ่มค่าที่ pnum ชี้ไปซึ่งก็คือหมายเลข
2 และหมายเลข 2 คือ 3 ตอนนี้หมายเลข 2 ควรเป็น 4
และเราเห็นว่ามันคือ 4
ตอนนี้เราจะพิมพ์ค่าทั้งหมดเหล่านี้ออกมา แล้วคุณจะเห็นค่าของ
num1 ควรเป็น 2
ค่าของ num2 ควรเป็น 4
Pnum ชี้ไปที่ num2 ดังนั้นจึงควรเป็น 4 นิ่ง
แล้วเราจะบอกว่าค่าของ pnum ซึ่งเท่ากับ 4 บวก
num2 ซึ่งเท่ากับ 4 ควรเป็น 8
ดังนั้นฉันอาจจะเลิกกับ 6 ไปแล้วจริงๆ
ตอนนี้เราจะไม่สามารถเห็นสิ่งนั้นในหน้าต่างนาฬิกาได้ ลองเล่นและดูผลลัพธ์เป็นคำสั่ง
printf เราควรจะเห็น 2448
ลองใช้โหมดนี้ในโหมดที่ไม่ใช่ดีบักแล้วเราจะเห็น
2 4 4 8
ดังนั้นเราจึงไป ฉันหวังว่านั่นจะสมเหตุสมผล
กลับไปและดำเนินการต่อการสนทนาของเรา
แล้วเมื่อเราได้รับข้อมูล เราจะใช้พอยน์เตอร์ในลักษณะนั้นได้อย่างไร
จนถึงตอนนี้เมื่อเราใช้ scanf เพื่อป้อนค่า เราต้องใช้ตัวดำเนินการ ampersand ทุกครั้งที่เรามีประเภทข้อมูล
inter หรือ float ครั้งเดียวที่เรามีก็คือเมื่อเรามีอาร์เรย์อักขระและเหตุผลก็คือเพราะจริง
ๆ แล้วอักขระ a เป็นตัวชี้อักขระที่เราจะพูดถึง
แต่ถ้าเราใช้ scanf เพื่อป้อนค่าและใช้กับประเภทข้อมูลปกติที่ไม่ใช่อาร์เรย์อักขระ
เราต้องใช้ตัวดำเนินการ add หรือ sub นี้เสมอ
และเหตุผลที่เป็นอาร์กิวเมนต์ที่สองของ scanf คือตัวชี้
เลยต้องส่งที่อยู่ พอยน์เตอร์มีค่าที่อยู่เท่านั้น
ดังนั้นเมื่อคุณมีพอยน์เตอร์ที่มีที่อยู่อยู่แล้ว คุณสามารถใช้ชื่อตัวชี้เป็นอาร์กิวเมนต์สำหรับ scanf ได้
ดังนั้น ตอนนี้ คุณไม่จำเป็นต้องใช้เครื่องหมายและตัวดำเนินการ
ถ้าคุณสร้างตัวชี้จริง ๆ เพราะอาร์กิวเมนต์ที่สองของ scanf คือตัวชี้ ดังนั้นคุณจึงสามารถพูดชื่อตัวชี้ได้
ในอดีต หากเราต้องการจัดเก็บค่าเป็นค่า เราจะบอกว่าค่าเครื่องหมายและในอาร์กิวเมนต์
scanf วินาที
แต่ถ้าเรามีพอยน์เตอร์ที่เราสร้างขึ้นและมันชี้ไปยังแอดเดรสแล้วเหมือนในตัวอย่างนี้
เมื่อเราใช้ scanf สิ่งที่เราจะต้องพูดก็คือชื่อของค่า ชื่อของพอยน์เตอร์
นี่เป็นกรณีที่เรามีจำนวนเต็ม แต่เราไม่จำเป็นต้องใช้เครื่องหมายและเพราะเรามีตัวชี้ไปยังจำนวนเต็ม
เราแค่บอกว่า เปอร์เซ็นต์ d, ค่า p
ดังนั้นจึงมีบางครั้งที่คุณสามารถส่งผ่านชื่อปกติของตัวแปรไปยัง
scanf นอกเหนือจากอาร์เรย์อักขระหากคุณมีพอยน์เตอร์
คุณยังสามารถพิมพ์สิ่งที่พวกเขาป้อนในภายหลัง และคุณจะสังเกตเห็นว่าค่าจะถูกเปลี่ยนเป็นสิ่งที่พวกเขาป้อนจริง
ๆ เนื่องจากเรากำลังชี้ไปยังที่อยู่นั้น
การทดสอบหาค่า null
มีกฎข้อหนึ่งที่คุณต้องเขียนลงในความทรงจำ นี่เป็นสิ่งสำคัญมาก
เราคุยกันเรื่อง dereference แล้ว แต่จะเกิดอะไรขึ้นหากคุณละเลยตัวชี้ที่ไม่ได้ตั้งใจ
ตัวชี้ที่ไม่ชี้ไปที่สิ่งใด หรือตัวชี้ที่ไม่มีหน่วยความจำที่จัดสรรไว้
แล้วถ้าเราทำอะไรแบบนี้ เราประกาศพอยน์เตอร์ แต่เราไม่เคยเริ่มต้นจริง
ๆ แล้วจึงพยายามกำหนดให้กับตัวชี้
เรายกเลิกการอ้างอิงและมอบหมายให้ นั่นเป็นความผิดพลาดครั้งใหญ่
โดยทั่วไป บรรทัดที่สองหมายความว่าคุณต้องการเก็บค่า
5 ในตำแหน่งที่ pt ชี้ไป แต่ pt ไม่ได้ชี้ไปที่สิ่งใดเพราะยังไม่ได้เริ่มต้น
ดังนั้น pt จึงมีค่าสุ่ม
เลยไม่รู้ว่าจะวางเลข 5 ไว้ตรงไหน จะเอาไปวางไว้ที่ไหนก็ได้ในความทรงจำ
สิ่งนี้อาจไม่เป็นอันตราย อาจประเมินข้อมูลที่มีอยู่หรือตัวแปรสถานะที่มีอยู่ในโปรแกรมของคุณมากเกินไป
อาจทำให้โปรแกรมหยุดทำงาน มันมีปัญหามาก
ดังนั้นเมื่อคุณสร้างพอยน์เตอร์และจัดสรรหน่วยความจำเพื่อจัดเก็บตัวชี้เอง ตัวชี้จะไม่จัดสรรหน่วยความจำเพื่อจัดเก็บข้อมูล
ดังนั้นโดยบอกว่า instar pt นั้นจัดสรรหน่วยความจำสำหรับตัวชี้
แต่ไม่ได้จัดสรรหน่วยความจำใด ๆ สำหรับค่าของตัวชี้ที่อยู่
จำไว้ว่าพอยน์เตอร์มีที่อยู่
มันสร้างตัวชี้ แต่ไม่ได้สร้างหน่วยความจำสำหรับสิ่งที่ชี้ไป
ดังนั้นคุณจึงไม่สามารถเพิกเฉยได้
จึงไม่จัดสรรหน่วยความจำเพื่อเก็บข้อมูล
ก่อนที่คุณจะใช้พอยน์เตอร์ ควรกำหนดตำแหน่งหน่วยความจำที่จัดสรรไว้แล้วหรือคุณต้องใช้การจัดสรรหน่วยความจำแบบไดนามิกโดยใช้
malloc ซึ่งเราจะพูดถึง ดังนั้นคุณจะกำหนดที่อยู่ของตัวแปรที่มีอยู่ให้กับตัวชี้หรือคุณใช้ malloc ซึ่งเป็นการจัดสรรหน่วยความจำแบบไดนามิก
แต่จำไว้ว่าเมื่อใดก็ตามที่คุณใช้พอยน์เตอร์ ถ้าคุณสร้างมันขึ้นมาและมันเป็นโมฆะ
คุณต้องการตรวจสอบก่อนว่าเป็นโมฆะ เราจะพูดถึงมันในอีกสักครู่
แต่ถ้าคุณสร้างพอยน์เตอร์ไม่ได้ถูกเตรียมใช้งาน
อย่ากำหนดอะไรให้กับมัน เว้นแต่ว่ามันจะชี้ไปที่ตัวแปรอื่นที่ตั้งค่าเริ่มต้นด้วยวิธีนั้น
หรือมีการจัดสรรหน่วยความจำ
นี่จึงเป็นที่มาของค่า null
คุณสามารถทดสอบค่า null ได้จริงเพื่อให้แน่ใจว่าคุณไม่มีข้อผิดพลาดในการอ้างอิง
ตรวจสอบให้แน่ใจว่าโปรแกรมของคุณไม่ขัดข้อง
ดังนั้นเราจึงรู้อยู่แล้วว่าโดยพื้นฐานแล้วค่า null นั้นชี้ไปที่ไม่มีอะไรเลย
และเราควรเริ่มต้นตัวแปรทั้งหมดของเรา ตัวชี้ของเราไปที่ค่า null
ดังนั้นเราควรทำอะไรแบบนี้เสมอ
Null เป็นสัญลักษณ์พิเศษใน c ที่แสดงถึงตัวชี้ที่เทียบเท่ากับศูนย์ด้วยตัวเลขธรรมดา
ด้านล่างยังตั้งค่าตัวชี้เป็นโมฆะโดยใช้ศูนย์
ดังนั้นเราจึงสามารถทำได้เช่นกัน หากเราไม่ต้องการส่งต่อหรือกำหนดให้เป็นโมฆะ เราสามารถบอกได้ว่า
0 และนั่นก็เท่ากับการบอกว่าไม่ชี้ไปที่อะไร
ดังนั้น เนื่องจาก null มีค่าเท่ากับ 0 หากคุณต้องการทดสอบว่าค่า
p เป็น null หรือไม่ คุณสามารถทำบางอย่าง เช่น ใช้การทดสอบที่ชัดเจน
คุณสามารถพูดได้ว่า pointer เท่ากับ null
และถ้าพอยน์เตอร์เท่ากับ null หมายความว่ามันเป็นศูนย์
คุณก็สามารถทำอะไรบางอย่างได้
ดังนั้นหากไม่ใช่ศูนย์หรือไม่เป็นโมฆะ มันคือค่าหนึ่งจริงหรือค่าอื่นใด
นั่นคือวิธีตรวจสอบว่ามีการขัดข้องหรือไม่
คุณต้องแน่ใจว่าก่อนที่คุณจะพยายามยกเลิกบางสิ่ง
สิ่งนี้จะบอกคุณว่ามีการจัดสรรหน่วยความจำหรือไม่
ดังนั้น คุณต้องการตรวจสอบค่า null ก่อนที่คุณจะยกเลิกการอ้างอิงตัวชี้
และคุณมักจะทำเช่นนี้ในฟังก์ชันเพราะฟังก์ชันจะใช้พอยน์เตอร์เป็นพารามิเตอร์
และหากผู้โทรส่งข้อมูลที่ไม่ดีหรือส่งผ่านในพอยน์เตอร์ไม่ได้จัดสรรหน่วยความจำไว้
โค้ดของคุณก็อาจขัดข้องได้
ดังนั้นสิ่งที่คุณต้องการทำคือคุณต้องการให้แน่ใจว่าผู้โทรมีที่อยู่ที่ถูกต้อง
เพื่อให้คุณตรวจสอบเป็นโมฆะได้
โดยพื้นฐานแล้วสิ่งนี้หมายความว่าจะต้องมีสิ่งเหล่านี้เสมอหากตรวจสอบว่าไม่ใช่ค่า
p หรือไม่ใช่ตัวชี้
และถ้าไม่ใช่ตัวชี้ คุณก็เลิกอ้างอิงได้
เรากำลังพูดถึงพอยน์เตอร์อยู่มาก เราได้พูดคุยกันค่อนข้างน้อย
ฉันแน่ใจว่ามันเริ่มล้นหลามเล็กน้อย คุณอาจต้องการพักสมองและทบทวนบทเรียนก่อนหน้านี้
พยายามทำให้แนวคิดนี้ตรงกันในหัวของคุณ
พอยน์เตอร์มีที่อยู่เท่านั้น
แต่มันมี 3 ส่วน ดังนั้นมันจึงอาจมีปัญหาได้
แต่อยู่ในเชิงบวก อยู่กับฉันและฉันรู้ว่ามันน่าสับสน
เราได้พูดคุยเกี่ยวกับการทำงานกับที่อยู่
เราได้พูดคุยเกี่ยวกับการทำงานกับค่านิยม เราได้พูดคุยเกี่ยวกับการทำงานกับตัวชี้แล้ว
และเราได้พูดคุยเกี่ยวกับการทำงานกับตัวแปรที่ชี้ไปที่ตัวชี้
มีเรื่องทั้งหมดนี้ที่คุณต้องจำไว้
และอาจเป็นเรื่องที่ท่วมท้นและน่าหงุดหงิดมาก
และมันยากเสมอที่จะพยายามคิดให้ออกว่าเกิดอะไรขึ้นและจะต้องฝึกฝนอย่างมาก
วิธีที่ดีที่สุดในการทำความเข้าใจแนวคิดนี้และทุกสิ่งที่เราพูดคุยด้วยจนถึงตอนนี้คือการฝึกหัด
เขียนโปรแกรมสั้นๆ ที่ใช้แนวคิดทั้งหมดที่ผมกล่าวถึง
ดังนั้นให้เขียนโปรแกรมที่ได้รับค่าโดยใช้พอยน์เตอร์
นี่อาจเป็นการใช้ตัวดำเนินการทางอ้อม
เขียนโปรแกรมที่เปลี่ยนค่าโดยใช้พอยน์เตอร์
ดังนั้น นี่จะเป็นการไม่อ้างอิง การรับค่าโดยใช้พอยน์เตอร์จะเป็นชื่อของพอยน์เตอร์ซึ่งจะเป็นที่อยู่
การพิมพ์ที่อยู่ เราได้ตรวจสอบไวยากรณ์ทั้งหมดแล้ว
ฝึกฝนสิ่งนี้ซ้ำแล้วซ้ำอีกเพื่อที่คุณจะทำได้ดี
คุณต้องเพิ่มความมั่นใจและต้องศึกษาแนวคิดเหล่านี้อย่างละเอียดเพื่อที่จะเชี่ยวชาญ
เรายังมีอะไรอีกมากที่จะพูดเกี่ยวกับตัวชี้ แต่นี่อาจถึงเวลาแล้วที่คุณควรถอยออกมาและทบทวนสิ่งที่เราได้พูดถึงไปแล้วเพื่อที่จะได้เจาะลึกเข้าไปในหัวของคุณ
ขอขอบคุณ.