สวัสดีและยินดีต้อนรับกลับ ตอนนี้เราเข้าใจรายละเอียดเกี่ยวกับพอยน์เตอร์มากขึ้นแล้ว
ฉันต้องการพูดถึงตัวชี้อักขระ หลักๆ ก็คือวิธีที่คุณสามารถใช้พอยน์เตอร์อักขระเพื่อแทนสตริงได้
สตริงคืออาร์เรย์อักขระ อักขระหลายตัว คำ
ตอนนี้เรารู้แล้วว่าอาร์เรย์เกี่ยวข้องกับพอยน์เตอร์ในแนวคิดเรื่องเลขคณิตของตัวชี้อย่างไร
แนวคิดที่มีประโยชน์มาก
แนวคิดเหล่านี้มีประโยชน์มากเมื่อนำไปใช้กับสตริงอาร์เรย์อักขระ
เนื่องจากตอนนี้เราสามารถสำรวจอักขระสตริงทีละอักขระได้อย่างง่ายดาย
แอปพลิเคชันทั่วไปอย่างหนึ่งของการใช้ตัวชี้ไปยังอาร์เรย์คือการเป็นตัวชี้ไปยังสตริงอักขระ
เหตุผลคือหนึ่งในความสะดวกและประสิทธิภาพที่สำคัญ
ดังนั้นการใช้ตัวแปรตัวชี้ประเภทเพื่ออ้างอิงสตริงจะช่วยให้คุณมีความยืดหยุ่นมาก
ดังนั้น คุณจะต้องพยายามใช้พอยน์เตอร์อักขระให้มากที่สุดเท่าที่คุณจะทำได้เหนืออาร์เรย์อักขระ
โดยเฉพาะการใช้พอยน์เตอร์อักขระเพื่อส่งข้อมูลไปยังฟังก์ชัน
ของสวยๆงามๆทั้งนั้นเลย
ลองดูตัวอย่างที่ใช้อาร์เรย์ในการคัดลอกสตริง
ในตัวอย่างนี้ พารามิเตอร์อาร์เรย์ของเราจะเป็นอาร์เรย์อักขระ
คุณจะเห็นว่าถูกต้องในการประกาศฟังก์ชัน
ฉันต้องการเปรียบเทียบสิ่งนี้กับฟังก์ชันที่ใช้ตัวชี้อักขระและแสดงให้คุณเห็นว่าฟังก์ชันตัวชี้อักขระมีประสิทธิภาพมากขึ้นอย่างไร
ในตัวอย่างนี้ เรามีสองฟังก์ชัน ฟังก์ชันหนึ่งรับอาร์เรย์และอีกฟังก์ชันหนึ่งใช้พอยน์เตอร์
ในสตริงการคัดลอกฟังก์ชันแรก เราสามารถผ่านอาร์เรย์ทั้งหมดโดยใช้
for loop I เท่ากับศูนย์จาก sub I และเราไปจนสุดทางจนกว่าเราจะเห็นสตริงอักขระ
null จากนั้นเราเพิ่มตัวแปรควบคุมลูปของเรา
แล้วสิ่งที่คุณต้องทำคือบอกว่า 2 sub I เท่ากับจาก sub I เรากำลังดำเนินการมอบหมายโดยตรงที่นั่น
และในตอนท้ายหลังจากที่เราทำทุกอย่างจนเห็นอักขระ null เราก็เพิ่มอักขระ
null ที่ส่วนท้ายของอาร์เรย์ของเรา ซึ่งเป็นพื้นฐานที่ค่อนข้างง่าย
ตอนนี้เรามาดูกันว่าเราจะทำอย่างไรเมื่อเราใช้พอยน์เตอร์
ขั้นแรก เราประกาศให้พอยน์เตอร์เป็นการประกาศฟังก์ชันในสตริงการคัดลอกโดยเพียงแค่พูดว่า
char star ถึง char start from
ใน for loop ของเรา เราไม่จำเป็นต้องประกาศตัวแปรใดๆ
เนื่องจากเรามีพอยน์เตอร์ และเราแค่ต้องการวนซ้ำจนกว่า
from จะมาถึง null terminator
จากนั้นเราสามารถเพิ่มทั้งตัวชี้จากและไปยังตัวชี้
เพราะตรงนี้เรากำลังทำการคำนวณแบบจุด
เรากำลังเพิ่มตัวชี้หนึ่งตัวซึ่งกำลังเพิ่มที่อยู่ทีละตัว ซึ่งกำลังได้รับอักขระตัวต่อไป
และส่วนถัดไปของ loop line เราแค่ละเลยทั้ง
to และ the from เพราะเราต้องการกำหนดค่าจริงที่ตัวชี้ชี้ไป อักขระจริงไปยังตัวชี้
to
จากนั้นในตอนท้าย เราเพิ่มอักขระ
null ไปยังที่ใดก็ตามที่ตัวชี้ to ชี้ไป ซึ่งจะอยู่ที่จุดสิ้นสุดของที่อยู่สุดท้ายของสตริงสำหรับ
from แต่ตอนนี้ ชี้ไปที่ที่อยู่ ถึง
มันไม่ได้ดูแย่เกินไป ฉันหมายความว่าคุณมี for loop
โดยทั่วไปคุณมีโค้ดจำนวนเท่ากัน
แต่คุณเห็นความแตกต่างในไวยากรณ์
คุณไม่ได้ใช้ตัวห้อยและคุณใช้พอยน์เตอร์ ให้ใช้เครื่องหมายดอกจัน
อีกครั้ง ปัญหาของความสะดวกสัญกรณ์จริงๆ
คุณไม่เห็นข้อได้เปรียบใหญ่ที่นี่
แต่จริงๆ แล้ว คุณสามารถเพิ่มประสิทธิภาพสิ่งนี้ให้มากขึ้นเพื่อลดโค้ดที่น้อยลงเมื่อคุณใช้พอยน์เตอร์
ดังนั้นถ้าคุณมีอาร์เรย์อักขระเป็นตัวชี้
ถ้าคุณมีอาร์เรย์ของอักขระที่เรียกว่าข้อความ คุณสามารถกำหนดพอยน์เตอร์ให้กับอาร์เรย์นั้นและใช้องค์ประกอบในข้อความได้
ตรงนี้ เราสามารถพูดได้ว่า ตัวชี้ข้อความ
char star นั่นคือวิธีที่คุณกำหนดตัวชี้อักขระ
หากตัวชี้ข้อความถูกตั้งค่าให้ชี้ไปที่จุดเริ่มต้นของอาร์เรย์ของอักขระที่เรียกว่าข้อความ
คุณสามารถเพิ่มได้ทีละตัวโดยใช้โอเปอเรเตอร์ก่อนและหลังการใช้งานและการลดค่าเหล่านี้
ดังนั้นข้างต้น ตัวชี้ข้อความบวกบวกนี้จะตั้งค่าตัวชี้ข้อความให้ชี้ไปที่อักขระตัวถัดไปในข้อความ
ซึ่งก็คือข้อความย่อย 1
ถ้าเราอยากดูรังสีถัดไปเหมือนจำนวนเต็ม สิ่งที่เราต้องทำคือบวก
1 2 แล้วเราจะได้อักขระตัวถัดไป
มันมีประโยชน์มากกว่าในอาร์เรย์อักขระเพราะคุณสามารถจัดการอักขระทีละตัวได้อย่างง่ายดาย
หากคุณใช้ตัวชี้ข้อความแบบลบลบ ซึ่งเป็นตัวดำเนินการลดค่า ซึ่งจะตั้งค่าตัวชี้เป็นอักขระก่อนหน้าในข้อความ
โดยถือว่าตัวชี้ข้อความไม่ได้ชี้ไปที่จุดเริ่มต้นของข้อความ
เพราะถ้าเป็นเช่นนั้น คุณจะมีข้อผิดพลาดเหล่านี้ภายใต้ขอบเขต
ถ้ามันทำการบวกบวกที่ส่วนท้ายของสตริง คุณจะมีข้อผิดพลาดนอกขอบเขต
คุณต้องระวังเสมอเหมือนเลขคณิตจำนวนเต็มเพื่อไม่ให้ผ่านขอบเขตของอาร์เรย์
แต่ง่ายมาก มันเกี่ยวข้องอย่างใกล้ชิดเมื่อคุณทำเลขคณิตตัวชี้จำนวนเต็ม
เลขคณิตพอยน์เตอร์ของตัวละครเป็นสิ่งเดียวกัน
มันมีประโยชน์มากกว่าเดิมเพราะตอนนี้คุณสามารถดูอักขระแต่ละตัวได้โดยไม่ต้องใช้ตัวห้อย
ดังนั้นหากเราดูตัวอย่างก่อนหน้านี้
และเราสามารถปรับให้เหมาะสมยิ่งขึ้นอีกเล็กน้อยโดยใช้พอยน์เตอร์เพื่อทำให้โค้ดมีบรรทัดน้อยลง
ดังนั้นในสตริงการคัดลอกของเรา การประกาศฟังก์ชันนี้เหมือนกับเมื่อก่อน สร้างตัวชี้คู่โดยใช้เครื่องหมายดอกจัน
แต่เราไม่ได้ใช้ for loop อีกต่อไปแล้ว เพราะมันไร้สาระมากที่จะใช้
for loop ในตัวอย่างก่อนหน้านี้ เพราะเราไม่จำเป็นต้องเริ่มต้นตัวแปรควบคุมลูป
สิ่งที่เราต้องทำคือออกจากลูปตามเงื่อนไข
จากนั้นเราใช้ตัวดำเนินการ incrementation และ decrementation
ใน for loop แต่เราไม่จำเป็นต้องทำเช่นนั้น
ที่จริงแล้วมันง่ายกว่ามากที่นี่เพราะถ้าเราใช้ while loop สิ่งที่เราต้องทำคือดูที่
while loop และมันจะกระโดดออกมาถ้ามันชี้ไปที่อักขระ
null เพราะอักขระ null นั้นมีค่าเท่ากับศูนย์
และในขณะที่วนรอบจำได้ว่าบูลีนใน c ถูกแทนด้วยจำนวนเต็ม
หนึ่งเป็นจริงและจากนั้นศูนย์เป็นเท็จหรือศูนย์จริง
ๆ เป็นเท็จและจากนั้นสิ่งอื่นใดที่เป็นจริง
ในกรณีนี้ อักขระ null 0 ซึ่งเป็นเท็จ มันจะกระโดดออกมา
ดังนั้นสิ่งที่คุณต้องทำสำหรับเงื่อนไขการออกในขณะที่ลูปจะถูกใส่เครื่องหมายดอกจัน
การทำแบบนั้นคือการละเลยจากการดูว่าคุณค่าของตัวละครนั้นเป็นอย่างไร
เมื่อถึงจุดสิ้นสุดของสตริงที่เราต้องการคัดลอกจากเรากระโดดออกมา
มิฉะนั้น เราก็แค่ใส่การปรับเปลี่ยนพอยน์เตอร์ของเราตรงนี้
สองบวกบวกจากบวกบวก
ตอนนี้เป็นโอเปอเรเตอร์การเพิ่มโพสต์
นี่หมายความว่าอะไรคือ บวก บวก อยู่ทางขวามือของตัวแปร
และเมื่อคุณทำเช่นนี้ หมายความว่าคุณไม่ต้องเพิ่มเข้าไปจนกว่าคำสั่งจะเสร็จสิ้น
นี่จะทำอะไร, มันจะบอกว่าดาว 2 เท่ากับเริ่มต้น
แล้วหลังจากคำสั่งนั้นเสร็จ มันจะบวก 2 1 และบวกจาก 1
หากคุณมีเครื่องหมายบวกบวกก่อนชื่อตัวแปร มันจะเพิ่มไปยังตัวแปรนั้นก่อนที่จะดำเนินการคำสั่งนั้น
และนั่นจะเป็นปัญหาเพราะเราจะพลาดองค์ประกอบแรกที่คัดลอกมาในสตริง
แต่เราไม่ต้องการโค้ดเพิ่มเติมอีก เรากำลังดำเนินการเลขคณิตและการกำหนดตัวชี้การเพิ่มขึ้นจริงในคำสั่งเดียวกัน
ดังนั้นเราจึงลดโค้ดลงหนึ่งรายการ
อีกครั้ง สัญกรณ์ง่ายมาก
เราทำการมอบหมายเลขคณิตจำนวนเต็มได้ง่ายมาก
และในตอนท้าย หลังจากที่เราทำเสร็จแล้ว คัดลอกสตริงทั้งหมด
เราแค่เพิ่มอักขระ null ที่ส่วนท้ายของตัวชี้ที่เรามองข้ามไป
เพราะอันที่จริงทั้งสองเป็นสาเหตุที่มันผ่านลูป มันจะชี้ไปที่ตัวสุดท้าย
อักขระ.
เลยได้เคลียร์กันนิดหน่อยนี่ครับ
มันแสดงให้คุณเห็นถึงพลังของพอยน์เตอร์ และวิธีที่คุณสามารถใช้พอยน์เตอร์และเลขคณิตในบรรทัดเดียวกัน
และด้วยตัวดำเนินการเพิ่มและลดค่าเหล่านี้ บวกและลบลบเหล่านี้
มันทำให้เร็วและง่ายขึ้น ดังนั้นมันจึงมีประสิทธิภาพมากขึ้นเช่นกัน
หากเราต้องการใช้ฟังก์ชันสตริงการคัดลอก เราก็สามารถสร้างอาร์เรย์อักขระสองตัวได้
เราสามารถส่งอาร์เรย์อักขระโดยตรงไปยังสตริงการคัดลอกเนื่องจากอาร์เรย์อักขระ
0 ตัวเป็นตัวชี้
สิ่งเหล่านี้เป็นตัวชี้ ดังนั้น เราจึงไม่จำเป็นต้องยกเลิกการอ้างอิงหรือเพิ่มที่อยู่หรืออะไรก็ตาม
เราสามารถพูดได้ว่า string2, string1
ดังนั้นสิ่งที่จะทำคือจะคัดลอกสตริงเพื่อคัดลอกไปยังอาร์เรย์อักขระ
string2 แล้วพิมพ์ออกมาโดยใช้ printf
ฉันต้องการดูตัวอย่างวิธีที่คุณสามารถใช้พอยน์เตอร์อักขระแทนอาร์เรย์อักขระ
และเหตุใดจึงเป็นที่นิยมในบางครั้ง
เรากล่าวว่าบางครั้งเป็นการตั้งค่าโปรแกรมเมอร์ที่หากคุณเคยตั้งโปรแกรมในภาษาก่อนหน้าเช่น
Fortran คุณอาจเคยชิน แต่ถ้าคุณมี คุณจะเห็นประโยชน์ของการใช้พอยน์เตอร์
หวังว่านี่จะเป็นประโยชน์ ขอขอบคุณ.