สวัสดี และยินดีต้อนรับกลับมา
ในการบรรยายนี้ ฉันต้องการสาธิตความท้าทายของเราเกี่ยวกับเลขคณิตพอยน์เตอร์และการใช้ตัวปรับค่าคงที่
มาสร้างบล็อคโค้ดกัน ฉันจะสร้างโครงการใหม่ เราจะตั้งชื่อตัวอย่างเลขคณิตตัวชี้ตัวเดียวนี้
สิ่งที่เราจะทำในที่นี้คือ เราจะกำหนดความยาวของสตริงโดยใช้เลขคณิตจุด
สิ่งแรกที่ฉันต้องการทำคือฉันต้องการสร้างการประกาศฟังก์ชันของฉัน
นี่จะคืนค่าความยาวของสตริง มันจะมี int เป็นชนิดส่งคืน
ผมจะเรียกว่าความยาวสตริง
และนี่ก็แค่ใช้พอยน์เตอร์ แต่มันจะเป็นพอยน์เตอร์คงที่
เราไม่ต้องการเปลี่ยนค่าของสิ่งที่ชี้ไป
นั่นหมายความว่าเราจะใช้ค่าคงที่เป็นคีย์เวิร์ดแรก
จากนั้นเราจะระบุประเภทซึ่งเป็นอักขระ
และเราจะบอกว่าสตาร์ และเราจะตั้งชื่อมันว่าอะไรก็ได้ที่เราต้องการ สตริง
เพื่อย้ำอีกครั้งว่า ถ้าเราใส่ค่าคงที่ตรงนี้แทน นี่จะบอกว่าที่อยู่ของตัวชี้
ค่าของตัวชี้ไม่สามารถเปลี่ยนแปลงได้
แต่อีกครั้ง มันเป็นประเภทที่ซ้ำซากจำเจ และไม่จำเป็นต้องทำจริง
ๆ เพราะเรากำลังส่งผ่านค่า ผ่านการคัดลอก
ดังนั้นคุณจึงมีสำเนาที่อยู่อยู่แล้ว ไม่ว่าคุณจะเปลี่ยนที่อยู่นั้นหรือไม่ก็ตาม
แต่สิ่งสำคัญคือต้องเปลี่ยนสิ่งที่คุณกำลังชี้ไป หากคุณไม่ต้องการให้คุณค่าของสิ่งที่คุณกำลังชี้ไปเปลี่ยนแปลง
คุณต้องการทำอย่างต่อเนื่องที่นี่ และนั่นก็สำคัญ
ตอนนี้สิ่งที่เราต้องทำคือสร้างหลักของเรา
สร้างหลักของเรา สิ่งที่เราจะทำใน main คือเราจะเรียก
string length ซึ่งเป็นฟังก์ชัน string
length ที่มี string ต่างกัน
ลองพิมพ์ออกมา และจำไว้ว่า มันคืนค่าจำนวนเต็ม เพื่อให้เราสามารถบอกเปอร์เซ็นต์ d และเราก็แค่พิมพ์ความยาวของสตริงสองสามสตริงที่เราส่งผ่าน
เราจะเรียกความยาวสตริง และเราก็แค่ส่งผ่านสตริงคงที่
ดังนั้นเราสามารถใส่มันไว้ในเครื่องหมายคำพูดคู่ที่นี่
เราไม่ต้องสร้างตัวชี้ด้วยซ้ำ
คุณสามารถสร้างพอยน์เตอร์และกำหนดแล้วส่งต่อเข้าไปได้
แต่คุณต้องแน่ใจว่ามันเป็นค่าคงที่
แต่เนื่องจากโค้ดที่น้อยกว่านั้นง่ายกว่า เราจึงพูดได้ว่าการทดสอบความยาวสตริง
อีกครั้ง นั่นคือสตริงตามตัวอักษรคงที่
เราจะทดสอบกับอย่างอื่นเพิ่มเติม
เราจะใส่ช่องว่างหลังจากนั้น มาเพิ่มไลน์ฟีดกัน
ในที่นี้เราจะเรียกความยาวสตริง และที่จริงแล้ว ให้เรียกมันด้วยสตริงว่าง ตรวจสอบให้แน่ใจว่าเราเปลี่ยนเป็นศูนย์
แล้วอันที่สาม
เราว่าความยาวสตริง เราแค่ว่า เจสัน
โดยบังเอิญ เมื่อคุณสร้างสิ่งเหล่านี้ และส่งลิงก์ความยาวสตริงเหล่านี้
พวกเขาจะได้รับ null Terminator ที่เพิ่มเข้าไปโดยอัตโนมัติ
เราเรียนรู้ว่าเมื่อเราประกาศตัวชี้
นั่นเป็นข้อดีอย่างหนึ่ง หากคุณกำลังจะสร้างตัวชี้และมันจะเป็นตัวชี้
คุณไม่ต้องการระบุขนาด
คุณต้องการทำบางอย่างเช่นอักขระหากเป็นอาร์เรย์เพราะอาร์เรย์คืออาร์เรย์เป็นตัวชี้
แต่ถ้าเราไม่อยากระบุขนาด
เราอาจบอกว่าอักขระ p แล้วในนี้
เราก็แค่พูดว่า เจสัน
จำไว้ว่าบทเรียนที่ว่าถ้าเราไม่ระบุขนาดสำหรับอาร์เรย์อักขระ
จะเพิ่มตัวสิ้นสุด null และสร้างขนาดให้คุณโดยอัตโนมัติ
ด้วยวิธีนี้คุณจะไม่ทำผิดพลาด หากคุณใส่ขนาดไว้ในอาร์เรย์ คุณอาจมี
null Terminator ไม่เพียงพอ
มันเหมือนกันเมื่อเราส่งค่าลิเทอรัลไปยังความยาวของสตริง ตัวสิ้นสุด
null จะถูกเพิ่มที่ส่วนท้ายของมัน
ดังนั้นเราจึงสามารถสร้างตัวแปรเหล่านี้ในขั้นต้นและทำสิ่งนี้แล้วส่งต่อในแต่ละตัวแปร
แต่ฉันไม่อยากเสียเวลาสร้างตัวแปร ดังนั้นฉันจะทำอย่างนั้น
ตอนนี้สิ่งที่สำคัญมากสำหรับโค้ดนี้คือฟังก์ชัน
เราจะสร้างความยาวของสตริง จำไว้อีกครั้ง มันคืนค่าจำนวนเต็ม
และมันจะเป็นค่าคงที่ เราสามารถพูดได้ว่า string char star string คงที่
และคุณยังสังเกตเห็นว่าชื่อตัวแปรการประกาศฟังก์ชันไม่จำเป็นต้องตรงกัน
ฉันสามารถใส่สิ่งนี้เป็นสตริงได้และก็ใช้ได้เช่นกัน
ภายในฟังก์ชันนี้ เราต้องสร้างตัวชี้ท้องถิ่นเนื่องจากตัวชี้ภายในจะชี้ไปที่จุดสิ้นสุดของสตริง
และเมื่อเรามีแอดเดรสสำหรับส่วนท้ายของสตริงแล้ว
เราก็สามารถลบแอดเดรสสำหรับจุดเริ่มต้นของสตริงได้
ที่อยู่สำหรับจุดเริ่มต้นของสตริงคือสิ่งที่ส่งผ่านเข้ามา
สตริงจะชี้ไปที่องค์ประกอบแรกในอาร์เรย์หรือที่อยู่แรกของอาร์เรย์โดยอัตโนมัติ
ดังนั้นหากเราสร้างพอยน์เตอร์ในเครื่อง
และเราแค่ต้องการสร้างดาวถ่านแบบคงที่อีกครั้ง
และเราจะบอกว่าที่อยู่สุดท้ายเป็นอย่างไร
และนี่จะเท่ากับแอดเดรสเริ่มต้นของสตริง แล้วเราจะเพิ่มค่ามันในลูปของเราทุกครั้ง
ตอนนี้เรามีที่อยู่สุดท้ายแล้ว อีกครั้ง นี่เป็นตัวแปรในเครื่องที่จะเก็บที่อยู่ก่อนสิ้นสุดค่า
null
ตอนนี้เราก็เขียน while loop ได้แล้ว
และ while loop ของเรากำลังจะออกเมื่อเราเห็น null terminator
ตอนนี้เราทำได้สองวิธี
เราสามารถเปรียบเทียบตัวอักษร ดังนั้นเราจึงสามารถพูดบางอย่างเช่นในขณะที่ติดดาวที่อยู่สุดท้ายเพราะเราต้องยกเลิกการอ้างอิงมันไม่เท่ากับศูนย์แบ็กสแลชสามารถทำสิ่งนั้นได้
แต่นั่นเป็นรหัสจำนวนมาก สิ่งที่เราต้องทำคือพูดในขณะที่ติดดาวที่อยู่สุดท้าย
เพราะถ้าคุณละเลยตัวสิ้นสุดค่าว่าง
มันจะเท่ากับศูนย์ และศูนย์เท่ากับเท็จ
เรารู้ว่าบูลีนมีหนึ่งจริง ศูนย์เป็นเท็จ
ดังนั้นถ้ามันเป็นเท็จก็จะกระโดดออกมา ดังนั้นสิ่งที่คุณต้องทำคืออยู่ในสถานะในขณะที่ใส่ที่อยู่สุดท้ายติดดาว
อีกครั้ง สิ่งนี้จะลดการอ้างอิงตัวชี้
และเมื่อมันชี้ไปยังที่อยู่สุดท้าย มันจะชี้ไปที่ตัวสิ้นสุดค่าว่าง
ตอนนี้เราต้องตรวจสอบให้แน่ใจว่าเราแก้ไขที่อยู่สุดท้าย เพื่อชี้ไปที่ตัวสิ้นสุด null
สิ่งที่เราทำได้คือบอกว่า บวก บวก ที่อยู่สุดท้าย
ดังนั้นการวนซ้ำแต่ละครั้งของสิ่งนี้ในขณะที่ลูปจะเพิ่มที่อยู่จนกว่าจะเห็นศูนย์
ศูนย์แสดงถึงตัวสิ้นสุดที่เป็นโมฆะ
ดังนั้นผลลัพธ์สุดท้ายของหลังจากนี้ในขณะที่ดำเนินการวนซ้ำ
ที่อยู่สุดท้ายจะชี้ไปยังที่อยู่ของตัวสิ้นสุด null
จากนั้นเราสามารถลบแอดเดรสของ null terminator ออกจากแอดเดรสที่ถูกส่งผ่าน
สตริงของเรา และนั่นจะทำให้เรามีความยาว
นั่นคือทั้งหมดที่เราต้องทำในบรรทัดถัดไป เราสามารถพูดได้ว่าส่งคืนที่อยู่สุดท้ายของเราและเราต้องการลบที่อยู่นั้นจริง
ๆ ดังนั้นเราจึงไม่จำเป็นต้องยกเลิกการอ้างอิงสิ่งใดหรือใช้โอเปอเรเตอร์ทางอ้อม ที่อยู่สุดท้ายลบสตริง
ดังนั้นสตริงจึงถูกส่งผ่านเข้ามา
เราไม่แก้ไขเลย
ที่ชี้ไปที่ตัวอักษรตัวแรก นั่นจะชี้ไปที่เจ
นั่นจะเป็นที่อยู่หรือครั้งแรกที่เราโทรไปในบรรทัดที่แปด นั่นจะเป็นที่อยู่ของ s
ที่อยู่สุดท้ายจะชี้ไปยังที่อยู่ของ t สุดท้ายนี้
ที่จริงมากกว่านั้นอีก ตัวสิ้นสุดค่าว่าง ถ้าเราบอกว่าที่อยู่สุดท้ายลบที่อยู่ของ
s มันจะให้ความยาวแก่เรา
และนั่นคือสิ่งที่เราจะกลับไป
ดังนั้นฉันหวังว่านั่นจะสมเหตุสมผล
อีกครั้ง ในบรรทัดที่ 17 เรากำลังสร้างตัวแปรโลคัลเพราะเราต้องติดตามที่อยู่สุดท้าย
ที่อยู่ของตัวสิ้นสุด null
หลังจากนี้ในขณะที่ลูปทำงานเสร็จแล้ว ที่อยู่สุดท้ายจะชี้ไปที่หลัง
t ซึ่งเป็นตัวสิ้นสุด null
จากนั้นเราสามารถลบที่อยู่สุดท้ายออกจากสตริง ที่อยู่ของสตริงชี้ไปที่
s เมื่อมันเข้ามา เราจะไม่แก้ไขสิ่งนั้น
ลองดูว่าสิ่งนี้ทำให้เรากลับมามีความยาวที่ถูกต้องได้อย่างไร
เมื่อเรารันสิ่งนี้ เราควรเห็นความยาวของสตริงที่เราส่งผ่านเข้ามา
เราจึงเห็น 17 0 และ 5
มาดูกัน 1 2 3 4 5 6 7 8 9 10 11 12 13
คุณต้องนับช่องว่าง 14 15
16 17 ใช่แล้ว เราใส่เครื่องหมายคำพูดคู่ซึ่งว่างเปล่า
ดังนั้นมันควรเป็นศูนย์ แล้วเจสันควรเป็น 5 ดังนั้น
17 0 และ 5 ถูกต้องแล้ว
สิ่งที่เราทำในที่นี้คือเราใช้เลขคณิตตัวชี้เพื่อรับที่อยู่สุดท้าย
บวก บวก ตัวดำเนินการการเพิ่มขึ้น แล้วชี้เลขคณิตของเราเพื่อให้ได้ความยาวโดยลบที่อยู่สุดท้ายลบสตริง
ค่อนข้างเรียบร้อย ฉันกำลังพยายามแสดงพลังของเลขคณิตจุด
ความสะดวกในการสัญกรณ์ของมัน
คุณสามารถเพิ่ม ลดระดับเพื่อไปยังจุดต่าง
ๆ ในอาร์เรย์อักขระและดึงอักขระออกได้อย่างไร
ในกรณีนี้
เราก็แค่รับที่อยู่ แล้วใช้ที่อยู่ลบกันเพื่อให้ได้ความยาว
ดังนั้นฉันหวังว่านี่จะเป็นประโยชน์ ให้แน่ใจว่าคุณเข้าใจทุกสิ่งที่ฉันเพิ่งพูดถึง
อีกครั้ง แนวคิดของค่าคงที่ แนวคิดของ บวก บวก แนวคิดของเงื่อนไข หากคุณไม่อ้างอิงที่อยู่
และนั่นชี้ไปที่ตัวสิ้นสุดค่า null มันจะเป็นศูนย์
ดังนั้นมันจึงกระโดดออกมา จากนั้นแนวคิดของการลบที่อยู่สองตัวนี้
ขอขอบคุณ.