สวัสดีและยินดีต้อนรับกลับ
ฉันอยากจะเสนอวิธีแก้ปัญหาให้กับ ความท้าทายครั้งก่อนในการบรรยายครั้งนี้
สาธิตวิธีการของคุณ สามารถมีตัวชี้เป็นองค์ประกอบภายในโครงสร้างและยัง
ส่งผ่านพอยน์เตอร์สองหน้าที่คือโครงสร้าง
เลยเอาโค้ดมา บล็อกสร้างโครงการใหม่
นี่จะเป็นคอนโซล แอปพลิเคชัน และเราจะตั้งชื่อตัวอย่างตัวชี้โครงสร้างนี้
ดังนั้นถ้าคุณจำสำหรับ ข้อกำหนดสำหรับสิ่งนี้
นี่เป็นเพียงประเภทผลิตภัณฑ์เท่านั้น โครงสร้างที่เก็บชื่อรายการ ปริมาณ ราคา
และจำนวนเงิน
และชื่อรายการกำลังไป เพื่อเป็นตัวชี้ตัวละคร
คุณกำลังจะมี จำนวนเงินที่โดยทั่วไปเพียงแค่คูณปริมาณในราคา
แล้วเราก็มีสองหน้าที่ ที่จะใช้เป็นตัวชี้พารามิเตอร์ไปยังโครงสร้าง
อย่างแรกเลยคือเรา เรากำลังจะสร้างโครงสร้างของเรา
และฉันได้กล่าวถึงสิ่งนี้ก่อนหน้านี้ แต่ เป็นการดีที่จะสร้างโครงสร้างทั่วโลกเพราะถ้าคุณต้องการ
ใช้งานได้หลากหลายฟังก์ชั่น
การสร้างโครงสร้าง กำลังกำหนดมันจริงๆ
คุณไม่ได้จัดสรรหน่วยความจำใด ๆ
จึงไม่เสียหาย วางไว้ทั่วโลก
และมักจะเข้าไปข้างใน ไฟล์ส่วนหัวอยู่แล้ว
ดังนั้นเพื่อสร้างโครงสร้าง เราแค่พูดว่า struct
เราจะเรียกรายการนี้ว่าและ เราจะมีองค์ประกอบสี่ประการ
เราจะมีตัวละคร ตัวชี้ซึ่งเราจะเรียกชื่อรายการ
เราจะได้ปริมาณ
เราจะไปลอยกระทงกัน สำหรับราคาและเราจะมีการลอยตัวสำหรับจำนวนเงิน
และนั่นคือวิธีที่เราสามารถกำหนดได้ โครงสร้างของเราค่อนข้างพื้นฐาน
ตอนนี้อยู่ในหน้าที่หลักของเรา เรา ต้องการสร้างตัวแปรสำหรับประเภทโครงสร้างและตัวชี้ด้วย
สิ่งแรกที่เราอยากทำคือ คือเราแค่อยากจะพูด struct item ด้วยชื่อของโครงสร้างและ
จากนั้นเราจะเรียกสิ่งนี้ว่า
และนี่เป็นเพียง การสร้างตัวชี้คี่
นี้จะไปจัดสรรหน่วยความจำ สำหรับตัวแปรและองค์ประกอบทั้งสี่ภายในโครงสร้าง
ดังนั้นเราจึงต้องการสร้างตัวชี้ของเรา ตอนนี้และเราสามารถพูดได้ struct item
เราจะว่า p item เพราะเรามักจะตั้งชื่อตัวชี้ของเราด้วยคำนำหน้า
p.
เราก็เลยบอกว่าดอกจัน และเราพูดว่า p รายการ
แล้วในบรรทัดถัดไป เราแค่ต้องการกำหนดให้กับรายการตัวชี้ของเรา
รายการของเรา
เราเลยต้องใช้ ที่อยู่ของและเราบอกว่ารายการ
ตรงนี้เราก็มีความทรงจำ จัดสรรสำหรับองค์ประกอบในโครงสร้างของเราสำหรับตัวชี้ของเรา
เราไม่มีความทรงจำ จัดสรรสำหรับตัวชี้ตัวละครของเราซึ่งเป็นชื่อรายการของเรา
นั่นจะเป็นขั้นตอนต่อไป
ตอนนี้คุณอาจถามว่าทำไมเราถึงต้องการ เพื่อสร้างโครงสร้างรายการ
เราไม่ได้จริงๆ
เราสามารถสร้างพอยน์เตอร์และ ตัวชี้จะสร้างหน่วยความจำสำหรับตัวชี้รายการโครงสร้างนั้นเท่านั้น
มันจะจัดสรรหน่วยความจำสำหรับ int และ float
แต่เรายังต้องทำการจัดสรรชื่อรายการ
ฉันชอบทำสิ่งนี้เพราะ นี้มักจะเป็นแนวปฏิบัติที่ดี
โดยทั่วไปสิ่งที่คุณจะทำกับ โครงสร้างรายการแรกคือคุณจะเริ่มต้นมันและดังนั้นคุณ
จะมีการเริ่มต้นบางอย่าง
แต่เราไม่จำเป็นต้องทำอย่างนั้น
อย่างแรกที่อยากทำคือ จัดสรรหน่วยความจำสำหรับชื่อรายการของเรา
โดยพื้นฐานแล้วเราสามารถใช้ a ตัวดำเนินการพิเศษในการเข้าถึงองค์ประกอบหากเป็นตัวชี้
จำไว้ว่าสำหรับโครงสร้างที่ เป็นตัวชี้ คุณมีเส้นประแล้วมากกว่าสัญลักษณ์ที่คุณ
สามารถใช้เพื่อเข้าถึงองค์ประกอบ
มิฉะนั้น คุณจะต้องยกเลิกการอ้างอิง ตัวชี้เพื่อเข้าถึงองค์ประกอบ
เราสามารถทำบางอย่างเช่น นี้ในวงเล็บ
เราสามารถยกเลิกการอ้างอิงตัวชี้
เลยต้องทำอย่าง star p item แล้วใช้ จุดเพื่อเข้าถึงองค์ประกอบ
ถูกต้องที่สุด เพื่อทำสิ่งนี้
แต่มันเป็นชนิดของไวยากรณ์พิเศษ ที่คุณไม่ต้องการจริงๆ
ดังนั้น c มีไวยากรณ์พิเศษที่ คุณสามารถใช้เมื่อใดก็ตามที่โครงสร้างของคุณเป็นตัวชี้ถ้าคุณ
ต้องการเข้าถึงองค์ประกอบ
โดยทั่วไปคุณสามารถพูดชื่อได้ ของตัวชี้ซึ่งเป็นรายการ p แล้วใช้เส้นประแล้วมากกว่า
และในกรณีนี้เราต้องการ จัดสรรหน่วยความจำสำหรับชื่อรายการ
ดังนั้นเราจะกำหนดว่าคืออะไร กลับจากฟังก์ชัน malloc
อย่าลืมว่าฟังก์ชัน malloc ส่งคืนตัวชี้เป็นโมฆะ
เลยต้องหล่อ สู่ดวงดาวของตัวละคร
แต่เราเรียก malloc ได้ แค่ พูด malloc แล้วตามด้วยขนาดของไบต์ที่เราต้องการสร้าง
ในกรณีนี้ เราจะบอกว่า 30 และเราจะคูณมันด้วยขนาดของถ่าน เผื่อว่าถ่านเป็น
a ขนาดแตกต่างกันบนคอมพิวเตอร์เครื่องอื่น
และจะจัดสรรให้ หน่วยความจำสำหรับชื่อรายการของเรา
เราต้องทำสิ่งนี้เพราะชื่อรายการ เป็นตัวชี้ภายในโครงสร้าง
มันไม่มีความทรงจำ จัดสรรไว้เมื่อคุณกำหนดให้กับโครงสร้างอื่น
ดังนั้นเราจึงต้องทำสิ่งนี้
ตอนนี้สิ่งแรกที่คุณต้องการ สิ่งที่ต้องทำหลังจากที่คุณจัดสรรหน่วยความจำแล้วให้ตรวจสอบ
malloc
ดังนั้นเราจึงต้องการตรวจสอบค่า null ที่นี่
เราจะบอกว่า if p item, if เป็นโมฆะที่จะบอกว่าเป็นโมฆะ
ไม่งั้นก็บอกว่าถ้าไม่ใช่ก็ทำได้ แค่พูดว่า return หรือ exit อาจจะดีกว่า ออกจากโปรแกรมถ้าเรา
ไม่สามารถจัดสรรหน่วยความจำได้และคุณสามารถส่งต่อไปยังค่าลบได้
มิฉะนั้น เราต้องการที่จะอ่านใน an รายการ ดังนั้นเราจึงต้องการสร้างฟังก์ชัน
หน้าที่ที่เราจะไป เพื่อสร้างเรียกว่าอ่านรายการ
มาสร้างการประกาศฟังก์ชันกันเถอะ ที่นี่เหนือโครงสร้าง
มันก็แค่จะอ่านในข้อมูล เข้าไปในโครงสร้างที่เราส่งผ่านไปยังมัน
มันจะไม่ส่งคืนข้อมูลใด ๆ
เราพูดได้เลยว่าอ่านรายการ และมันต้องใช้โครงสร้าง และนั่นจะเป็นตัวชี้
มันคือรายการโครงสร้าง เครื่องหมายดอกจัน I.
ตอนนี้เราสามารถทำให้มันเป็นค่าคงที่ได้ ดังนั้นค่าของการเปลี่ยนแปลง
แต่เรากำลังเปลี่ยนค่า
แต่เราสามารถพูดได้ว่าโครงสร้างคงที่ the ค่าจะไม่สามารถเปลี่ยนแปลงได้สำหรับตัวชี้ที่ชี้ไป
หากเราทำค่าคงที่หลังจาก เครื่องหมายดอกจันที่จะบอกว่าที่อยู่ไม่สามารถเปลี่ยนแปลงหรือถูกต้อง
ก่อนเครื่องหมายดอกจันอะไรแบบนั้นหลังชื่อ
ที่จะบอกว่าที่อยู่ไม่สามารถ เปลี่ยน แต่นั่นซ้ำซ้อนเพราะเรากำลังส่งผ่านค่าการคัดลอก
เรามีรายการอ่านของเรา
และในขณะที่ฉันอยู่บนนี้ ฉันอาจจะ งานพิมพ์ของฉันก็เช่นกัน
นั่นก็แค่หน้าที่ ประกาศ ฟังก์ชันต้นแบบ
มันก็จะฟินๆหน่อย คล้ายกัน ใช้ตัวชี้ด้วย
สามารถมีพื้นที่ถ้าคุณต้องการ หลังเครื่องหมายดอกจันหรือไม่?
ตอนนี้เราสามารถกำหนด read . ของเราได้แล้ว รายการด้านล่างวิธีการหลักของเรา
และนี่กำลังจะอ่าน ในมูลค่าของรายการแล้วคำนวณยอดรวม
ดังนั้นเราสามารถพูดได้ว่าอ่านเป็นโมฆะ รายการมีตัวชี้ของเรา
และข้างในนี้เราต้องการ เพื่อใช้ scanfs จริงๆ
เรากำลังจะไปพิมพ์ข้อความ เพื่อบอกให้ผู้ใช้ป้อนข้อมูล
เราจะบอกว่า enter ชื่อผลิตภัณฑ์ แล้วเราจะเข้าไปอ่านกัน
เราจะบอกว่า scanf และเรามีตัวชี้ไปยังโครงสร้างเพื่อให้เราสามารถเข้าถึงได้
ใช้เส้นประแล้วมากกว่า
เราต้องการอ่านเพื่อ scanf, the ชื่อผลิตภัณฑ์เป็นบัฟเฟอร์อักขระ
ดังนั้นเราจึงต้องการบอกว่า เปอร์เซ็นต์ s และ จากนั้นเราจะบอกว่า I เราจะเก็บมันไว้ในชื่อรายการ
และเราสามารถกลับไปใช้ Intellisense เพียงไปที่ชื่อรายการ
เราไม่จำเป็นต้องใช้ ที่อยู่ของโอเปอเรเตอร์เพราะมันเป็นตัวชี้อักขระ
เราก็อยากจะปริ้นออกมาแล้วได้ ราคาอาจต้องการเพิ่มการป้อนบรรทัดที่นี่
ป้อนราคา
เรากำลังจะไปเก็บ ที่อยู่ในโครงสร้างนั้น
ดังนั้นอีกครั้งราคาเป็นลอยแม้ว่า
ผมก็เลยบอกว่า เปอร์เซ็นต์ f, แต่ เราจะเข้าถึงมันด้วยเพราะมันเป็นตัวชี้ เรายังต้องการ
ใช้เส้นประแล้วมากกว่า
ยกเว้นครั้งนี้เราจะไป พูดราคาและเราจำเป็นต้องได้รับที่อยู่ของมันดังนั้นเราจะไป
ใส่เครื่องหมายข้างหน้าเพราะราคาไม่ใช่ตัวชี้
แล้วเราจะไปทำ สิ่งเดียวกันสำหรับปริมาณ
ปริมาณจึงเป็นจำนวนเต็ม
เราสามารถพูดได้ว่า เปอร์เซ็นต์ d เรายังต้องการอยู่ เพื่อให้ได้ที่อยู่ของมัน
แต่เราต้องการเก็บไว้ในองค์ประกอบอื่น เราต้องการเก็บไว้ในปริมาณ
ตอนนี้เราเก็บหรือขอแล้ว ผู้ใช้ป้อนข้อมูลสามรายการตอนนี้เราสามารถ
คำนวณจำนวนเงินจริงเก็บบางสิ่งบางอย่างในจำนวน
จำนวนเงินเป็นเพียง ปริมาณคูณราคา.
ดังนั้นเราจึงยังต้องการเข้าถึง โครงสร้างโดยใช้ไวยากรณ์ของเรา,
เราต้องการโยนมัน, เราต้องการลงนาม ปริมาณคูณราคา.
และนั่นคือฟังก์ชันรายการอ่าน
ใช้ตัวชี้โครงสร้าง
ดังนั้นเมื่อเราแก้ไขตัวชี้นี้ ภายในรายการที่อ่าน
จะถูกแก้ไขนอกฟังก์ชัน
ดังนั้นโครงสร้างใด ๆ ที่เรา ผ่านเข้าไปในฟังก์ชันนี้ มันจะได้รับการแก้ไข
มันจะเก็บ รายการ ชื่อรายการ ราคาและปริมาณและจำนวน
เพื่อที่จะอ่านในข้อมูล
ณ จุดนี้คุณต้องการ ทดสอบและคุณอาจต้องการรวบรวมและทดสอบก่อนหน้านี้
แต่ตอนนี้เราสามารถเรียกรายการที่อ่านได้ วิธีการขึ้นในหลักของเราและส่งต่อในโครงสร้างของเราที่เราสร้างขึ้น
เราสามารถพูดได้ว่า read item, และเราสามารถพูดได้ว่า p รายการ
เราไม่ต้องผ่านใน เพราะมันเป็นตัวชี้ ดังนั้นเราก็แค่ผ่านเข้าไปในโครงสร้างของเรา
แล้วสิ่งต่อไปที่เรา ทำได้คือพิมพ์ออกมา
และสิ่งนี้จะแสดงให้คุณเห็นคือ ว่าข้อมูลถูกบันทึกไว้ รายการ p กำลังถูกแก้ไขภายในฟังก์ชัน
และกำลังบันทึกอยู่นอกฟังก์ชัน ฟังก์ชันหลัก ได้บันทึกค่าเหล่านั้นไว้จริงๆ
พูดได้เลยว่าผ่านงานพิมพ์ ในตัวชี้อีกครั้ง จากนั้น เราสามารถกำหนดฟังก์ชันรายการพิมพ์ได้
รายการพิมพ์ค่อนข้างธรรมดา
มันไม่คืนอะไร ดังนั้นเราจึงพูดว่าเป็นโมฆะและเราบอกว่ารายการพิมพ์ใช้ตัวชี้
เราก็เลยบอกว่า struct item star ฉันสิ่งที่คุณต้องการตั้งชื่อ
แล้วเราก็พิมพ์ข้อมูลออกมา สำหรับโครงสร้างที่ผ่านเข้ามา
ดังนั้นเราจะทำบางอย่างเช่น printf name เปอร์เซ็นต์ s, I item name, I price,
I quantity and I จำนวนแล้วเราจัดรูปแบบข้อมูล
สิ่งสุดท้ายที่เรามี ที่จะทำในหลักหลังจากที่เราพิมพ์ข้อมูล,
the ฟังก์ชั่นฟรีที่สำคัญจริงๆ
เราต้องโทรฟรีเพราะเรา ต้องการเพิ่มหน่วยความจำที่เราจัดสรรให้กับชื่อรายการ
เราก็บอกได้เลยว่าฟรี p item แล้วเข้าถึงชื่อรายการ
เราไม่ต้องการที่จะปลดปล่อยทั้งหมด โครงสร้างเพราะโครงสร้างทั้งหมดจะถูกลบออกบน
สแต็คเมื่อฟังก์ชันส่งคืน
เราแค่ต้องการปลดปล่อยสิ่งที่เราคลุ้มคลั่ง
เราคลุกเคล้ากับไอเทมเท่านั้น ตั้งชื่อให้ว่างแล้วกลับจากหลัก
งั้นไปกันเลยและ พยายามสร้างสิ่งนี้
และเรามีข้อผิดพลาด
มาดูกันว่ามันบอกว่า struct item star
เลยพลาดไปว่า ฟังก์ชั่นถูกกำหนดไว้เหนือโครงสร้าง
แต่หน้าที่ของการรับ a พารามิเตอร์เป็นประเภทโครงสร้าง
เราก็เลยต้องมีโครงสร้าง กำหนดไว้ด้านบนว่าเราใช้ที่ไหน
เลยย้ายฟังก์ชัน ลงบรรทัดที่ 12 และ 13
ตอนนี้เราสามารถรวบรวม
ไปข้างหน้าและดำเนินการนี้
และมาดูกันว่าเราได้อะไรที่นี่
เรามีข้อผิดพลาดอีกอย่างหนึ่ง
คุณต้องแน่ใจว่าคุณ ตรวจสอบรายการ p สำหรับค่า null
ถ้าคุณแค่พูดว่า if p item for จริง มันจะเป็นจริงเสมอ
ดังนั้นคุณสามารถตรวจสอบเพื่อพูด มันไม่เป็นความจริงด้วยสัญลักษณ์
not หมายความว่าไม่ใช่ null หรือ you สามารถตรวจสอบดูว่าเป็นโมฆะหรือไม่
ผมก็เลยบวกค่า null ไว้ตรงนั้น
ตอนนี้เราดำเนินการแล้ว เรา ควรจะไปได้ดี
เราสามารถใส่ชื่อผลิตภัณฑ์
เราจะพูดว่าซีเรียส และเราจะ บอกว่าราคา 1 99.
และเราจะบอกว่าเรามีห้าคนในนั้น
และตอนนี้เราพิมพ์ออกมา และเราบอกว่าซีเรียลดอลลาร์ 99
5 จำนวนเงินทั้งหมดคือ 9 95.
ราคาทั้งๆที่ไม่ชอบ วิธีพิมพ์ราคา
มาแก้ไขกันเถอะ
ในรายการพิมพ์ของเรา เราสามารถพูดได้ว่าสำหรับ ราคา dor 2 f ลอย ตอนนี้เราจะดูดีขึ้นนิดหน่อย
และเราเรียกใช้มัน
มันก็จะฟินๆหน่อย บิตของรูปแบบที่ดีขึ้น
ทั้งสี่คนและตอนนี้มัน ดูดีขึ้นนิดหน่อย และทุกอย่างก็เรียบร้อยดี
ดังนั้นอีกครั้ง โปรแกรมพื้นฐานที่ใช้ โครงสร้างและตัวชี้
เราสร้างโครงสร้างที่ด้านบน
เรามีสมาชิกที่ประกอบด้วย ตัวชี้ ทำได้มากเพราะเราทำได้
เพียงคัดลอกและที่อยู่ตรงข้ามกับอาร์เรย์อักขระ
เรามีการประกาศ func สองรายการ อ่านรายการพิมพ์รายการที่ทำลายตัวชี้
จากนั้นเราก็สร้างตัวชี้ และกำหนดให้เป็นโครงสร้างปกติภายในหลักของเรา
เราจัดสรรหน่วยความจำในบรรทัดที่ 22
เรามั่นใจว่าหน่วยความจำคือ จัดสรรสำเร็จถ้าไม่ใช่เราออกจากโปรแกรม
แล้วเรียกเราสองคน ฟังก์ชันที่นำพอยน์เตอร์ไปยังโครงสร้าง
ส่งต่อเข้ามา
และสุดท้ายแต่ไม่ท้ายสุด เราเพิ่มหน่วยความจำแล้วออกจากโปรแกรม
และหน้าที่คือ ค่อนข้างตรงไปตรงมา
คุณใช้ตัวชี้นั้น
คุณเข้าถึงตัวชี้โดยใช้ เส้นประนั้นมากกว่า
และคุณได้รับที่อยู่ของ สำหรับ scanfs ที่ไม่มีพอยน์เตอร์เป็นองค์ประกอบ
และนั่นเป็นพื้นฐาน
ฉันจะบันทึกโปรแกรมนี้ คุณลองดูสิ
แจ้งให้เราทราบหากคุณมีคำถามใดๆ ขอขอบคุณ.