﻿1
00:00:04,340 --> 00:00:05,570
‫สวัสดีและยินดีต้อนรับ.

2
00:00:05,570 --> 00:00:12,050
‫ในการบรรยายนี้ เราจะเรียนรู้เกี่ยวกับการอ้างอิงและทางเลือกแทนตัวชี้ และเราจะมาดูกันว่าทำไมมันถึงแตกต่างกัน

3
00:00:12,050 --> 00:00:14,810
‫เหตุใดเราจึงอาจต้องการใช้

4
00:00:14,810 --> 00:00:16,370
‫มาดำดิ่งกันดู

5
00:00:17,220 --> 00:00:23,200
‫เช่นเดียวกับพอยน์เตอร์ มีแนวคิดที่เกี่ยวข้องกันมากที่เรียกว่าการอ้างอิง

6
00:00:23,220 --> 00:00:28,980
‫ตอนนี้ทั้งพอยน์เตอร์และการอ้างอิงเป็นเพียงที่อยู่หน่วยความจำเท่านั้น

7
00:00:28,980 --> 00:00:37,200
‫ทั้งคู่เก็บข้อมูลอ้างอิงถึงตำแหน่งที่สามารถพบตัวแปรอื่นได้ และด้วยวิธีนี้จึงมีความคล้ายคลึงกันอย่างไม่น่าเชื่อ

8
00:00:37,230 --> 00:00:43,140
‫ความแตกต่างระหว่างทั้งสองนั้นขึ้นอยู่กับว่าสามารถมอบหมายใหม่ได้หรือไม่

9
00:00:43,140 --> 00:00:48,650
‫โดยพื้นฐานแล้ว พวกเขาสามารถชี้ไปยังที่อยู่อื่นหลังจากสร้างครั้งแรกได้หรือไม่

10
00:00:48,660 --> 00:00:51,570
‫ในกรณีของตัวชี้คำตอบคือใช่

11
00:00:51,570 --> 00:00:57,660
‫คุณสามารถเปลี่ยนตัวชี้ให้ชี้ไปยังที่อยู่หน่วยความจำใหม่ ตัวแสดงใหม่ องค์ประกอบใหม่ได้ทุกเมื่อที่คุณต้องการ

12
00:00:57,660 --> 00:00:59,910
‫ตราบใดที่มีประเภทที่ถูกต้อง

13
00:01:00,210 --> 00:01:06,390
‫ในทางกลับกัน การอ้างอิงสามารถตั้งค่าได้เพียงครั้งเดียวเมื่อคุณสร้างการอ้างอิงไปยังตัวแปรอื่นในครั้งแรก

14
00:01:06,390 --> 00:01:09,450
‫จะไม่สามารถเปลี่ยนแปลงได้อีก

15
00:01:09,450 --> 00:01:21,480
‫และนี่คือคุณลักษณะด้านความปลอดภัยเนื่องจากตัวแปรชี้ตำแหน่งใหม่อาจนำไปสู่ปัญหาที่ตัวแปรเหล่านั้นอาจหายไปหรือตำแหน่งที่คุณตั้งค่าตัวชี้นั้นเป็นค่าว่าง

16
00:01:21,510 --> 00:01:28,020
‫null pointer เป็นตัวชี้ที่ชี้ไปที่ไม่มีอะไรเลย และการพยายามทำสิ่งต่าง ๆ ด้วยตัวชี้ที่ตั้งค่าให้ไม่มีอะไรสามารถทำให้เครื่องยนต์ของคุณพังได้

17
00:01:28,020 --> 00:01:37,410
‫ซึ่งไม่ใช่ผลลัพธ์ในอุดมคติที่มีการอ้างอิงเพราะคุณต้องให้ค่าแก่พวกเขาในครั้งแรกที่คุณ สร้างพวกเขา

18
00:01:37,560 --> 00:01:41,730
‫ไม่สามารถเป็นโมฆะได้ ดังนั้นคุณจึงไม่สามารถทำให้ตัวชี้ null ขัดข้องได้

19
00:01:41,940 --> 00:01:45,660
‫เรามาเริ่มดูที่ไวยากรณ์ที่เกี่ยวข้องกัน

20
00:01:45,660 --> 00:01:50,880
‫ดังนั้นเมื่อคุณเข้าถึงเนื้อหาด้วยพอยน์เตอร์ คุณต้องใช้ไวยากรณ์พิเศษบางอย่าง

21
00:01:50,880 --> 00:01:55,890
‫คุณต้องวางดาวนี้ไว้ข้างหน้าพอยน์เตอร์เพื่อให้แน่ใจว่าคุณได้รับค่าในพอยน์เตอร์ ไม่ใช่ที่อยู่หน่วยความจำที่มีข้อมูลอ้างอิง

22
00:01:55,890 --> 00:02:01,200
‫เพราะคุณไม่จำเป็นต้องเก็บที่อยู่หน่วยความจำจริงๆ

23
00:02:01,200 --> 00:02:06,240
‫คุณสามารถใช้ตัวแปรราวกับว่ามันเป็นตัวแปรที่มันชี้ไป

24
00:02:06,240 --> 00:02:08,460
‫คุณไม่จำเป็นต้องใช้ไวยากรณ์พิเศษใดๆ

25
00:02:08,820 --> 00:02:15,390
‫ขณะนี้มีการเข้าถึงที่อยู่ ดังนั้นด้วยพอยน์เตอร์ คุณจะได้รับที่อยู่โดยอัตโนมัติ

26
00:02:15,390 --> 00:02:18,750
‫เมื่อคุณใช้ตัวแปรที่มีการอ้างอิง คุณต้องใช้ไวยากรณ์พิเศษ

27
00:02:18,750 --> 00:02:26,670
‫ในการทำเช่นนั้น คุณต้องใช้ที่อยู่ของโอเปอเรเตอร์และคุณจะได้รับที่อยู่เดียวกันกับตัวแปรดั้งเดิม

28
00:02:27,210 --> 00:02:30,720
‫แล้วมีการเปลี่ยนที่อยู่ด้วยตัวชี้

29
00:02:30,720 --> 00:02:35,850
‫เราพบว่าคุณสามารถกำหนดที่อยู่และใช้ที่อยู่ของโอเปอเรเตอร์เพื่อทำข้อมูลอ้างอิงได้

30
00:02:35,850 --> 00:02:38,070
‫ไม่อนุญาต ดังนั้นจึงไม่มีไวยากรณ์

31
00:02:38,070 --> 00:02:46,200
‫และสุดท้าย จะเป็นอย่างไรถ้าเราต้องการเปลี่ยนค่าที่เราชี้ไป ไม่ใช่ที่อยู่ แต่เป็นค่าจริงที่เก็บอยู่ที่ที่อยู่นั้น

32
00:02:46,200 --> 00:02:50,740
‫ด้วยคำแนะนำที่คุณต้องใช้ไวยากรณ์พิเศษอีกครั้ง

33
00:02:50,740 --> 00:02:53,280
‫เราต้องใส่ดาวนั้นแล้วมอบหมายอะไรบางอย่าง

34
00:02:53,280 --> 00:03:00,750
‫ดังนั้นตัวชี้นักแสดงที่คุณกำหนดให้กับตัวชี้นักแสดงดาวที่มีการอ้างอิงอีกครั้งเพราะคุณไม่สามารถเปลี่ยนที่อยู่จริงได้

35
00:03:00,750 --> 00:03:03,270
‫คุณไม่จำเป็นต้องมีไวยากรณ์เพิ่มเติมใดๆ

36
00:03:03,270 --> 00:03:07,230
‫เราสามารถวางไวยากรณ์พิเศษและเพียงแค่มีการอ้างอิงนักแสดงเท่ากับ

37
00:03:07,230 --> 00:03:12,870
‫ตัวแสดงหมายความว่าคุณกำลังเขียนทับค่าในตำแหน่งที่ชี้ไปยังตำแหน่ง

38
00:03:12,870 --> 00:03:14,280
‫นั่นเป็นทฤษฎีเล็กน้อย

39
00:03:14,280 --> 00:03:16,200
‫มาดูตัวอย่างจริงกันเถอะ

40
00:03:16,200 --> 00:03:26,670
‫ดังนั้นถ้าเรามีทุ่นลอยที่อาจเก็บความเสียหายที่ทำกับเราในเกมและในนั้นเราจะจัดเก็บความเสียหายปัจจุบันเป็นศูนย์

41
00:03:26,670 --> 00:03:28,350
‫ไม่มีใครทำอันตรายใด ๆ กับเรา

42
00:03:28,380 --> 00:03:33,900
‫ตอนนี้ เราอาจต้องการสร้างการอ้างอิงถึงสิ่งนี้ แทนที่จะคัดลอกไปรอบๆ เราอาจต้องการส่งผ่านไปยังฟังก์ชัน

43
00:03:33,900 --> 00:03:36,960
‫แต่ไม่มีการเปลี่ยนแปลงจริงๆ

44
00:03:36,960 --> 00:03:42,690
‫วิธีที่เราสามารถทำได้คือการมีทุ่นแล้วใส่เครื่องหมายและหลังทุ่น

45
00:03:42,690 --> 00:03:45,390
‫และเครื่องหมายบอกว่านี่คือการอ้างอิงถึงทุ่น

46
00:03:45,390 --> 00:03:49,470
‫มันไม่ใช่โฟลตใหม่เอง ไม่ได้จัดสรรหน่วยความจำโฟลตใด ๆ

47
00:03:49,470 --> 00:03:51,360
‫มันแค่จัดสรรหน่วยความจำตัวชี้

48
00:03:51,510 --> 00:03:56,940
‫และเราสามารถเรียกสิ่งนี้ว่าการอ้างอิงความเสียหาย และเราสามารถตั้งค่าให้เท่ากับความเสียหายได้

49
00:03:56,940 --> 00:04:00,360
‫เราไม่จำเป็นต้องใช้ที่อยู่หรือทำอะไรแบบนั้น

50
00:04:00,360 --> 00:04:04,530
‫มันรู้โดยอัตโนมัติว่านี่คือข้อมูลอ้างอิงและนี่คือตัวแปร

51
00:04:04,530 --> 00:04:08,760
‫ดังนั้นสิ่งที่คุณพยายามจะทำในที่นี้คือตั้งค่าการอ้างอิงไปยังตัวแปรนั้น

52
00:04:08,760 --> 00:04:15,870
‫และแน่นอนว่า ถ้าเราไปและคุณเข้าสู่ระบบ เราสามารถพิมพ์สิ่งนี้ราวกับว่ามันเป็นเพียงทุ่นปกติ ดังนั้นเราสามารถพูดได้ว่าเครื่องหมายทวิภาคเสียหายและเปอร์เซ็นต์

53
00:04:15,870 --> 00:04:24,540
‫F แล้วที่นี่เราสามารถพิมพ์อ้างอิงความเสียหายได้

54
00:04:24,540 --> 00:04:25,860
‫เราไม่ต้องการรูปแบบพิเศษใดๆ

55
00:04:25,860 --> 00:04:28,470
‫เราสามารถใช้ได้เหมือนกับตัวแปรทั่วไป

56
00:04:28,470 --> 00:04:37,680
‫ไปต่อกันที่ Hit play หลังจากคอมไพล์แล้ว ดูบันทึกการส่งออกของเราและแน่ใจว่าความเสียหายจะออกมาที่ศูนย์ซึ่งเป็นค่าที่เราตั้งไว้

57
00:04:37,680 --> 00:04:42,720
‫แต่นั่นไม่จำเป็นต้องพิสูจน์ว่าฉันยังไม่ได้คัดลอกตัวแปรดั้งเดิมนั้น

58
00:04:42,900 --> 00:04:47,040
‫สมมติว่าคุณลองเปลี่ยนค่าและดูว่าเกิดอะไรขึ้น

59
00:04:47,040 --> 00:04:59,910
‫ดังนั้นใช้ค่าอ้างอิง, ค่าอ้างอิงถึงค่าเสียหายเพื่อตั้งค่าใหม่แล้วพิมพ์ค่าเดิมออกมาเพื่อให้ค่าเดิมอยู่ถัดจากค่าอ้างอิงและได้ดู

60
00:04:59,910 --> 00:05:01,770
‫พวกเขาเหมือนกันหรือแตกต่างกันหรือไม่?

61
00:05:01,770 --> 00:05:05,190
‫คุณเปลี่ยนการอ้างอิงเท่านั้น แต่มันเปลี่ยนต้นฉบับด้วยหรือไม่

62
00:05:05,190 --> 00:05:08,760
‫เพราะนั่นจะหมายความว่าทั้งสองเป็นตัวแปรเดียวกัน

63
00:05:08,790 --> 00:05:10,830
‫หยุดวิดีโอชั่วคราวและไปกันเลย

64
00:05:13,910 --> 00:05:14,420
‫ตกลง.

65
00:05:14,420 --> 00:05:15,130
‫ยินดีต้อนรับกลับ.

66
00:05:15,140 --> 00:05:16,610
‫เลยลองมาแทงกันดู

67
00:05:16,640 --> 00:05:22,310
‫ดังนั้นเพื่อเปลี่ยนการอ้างอิงตอนนี้ เราจะทำความเสียหายอ้างอิงเท่ากับ

68
00:05:22,310 --> 00:05:27,320
‫และครั้งนี้ฉันจะบอกว่าเราทำดาเมจได้ห้าครั้งแล้ว และสังเกตว่าฉันไม่จำเป็นต้องใช้ไวยากรณ์พิเศษใดๆ

69
00:05:27,320 --> 00:05:27,650
‫เลย

70
00:05:27,650 --> 00:05:34,760
‫ไม่ใช่การชี้จุดอ้างอิงใหม่เนื่องจากเราได้ประกาศและตั้งค่าการอ้างอิงในบรรทัดแรกนั้นเมื่อมีการสร้าง

71
00:05:34,760 --> 00:05:36,290
‫เราไม่สามารถทำมันได้อีก

72
00:05:36,290 --> 00:05:39,080
‫ตอนนี้เราสามารถตั้งค่าได้

73
00:05:39,410 --> 00:05:46,010
‫สิ่งที่ผมทำได้ตอนนี้คือเราได้รับความเสียหาย ผู้อ้างอิงอยู่ในบันทึก

74
00:05:46,040 --> 00:05:56,810
‫เรามาใส่ความเสียหายและเปอร์เซ็นต์ f ให้กับสตริงเดียวกันนั้นแล้วส่งความเสียหายที่นี่เช่นกัน

75
00:05:57,560 --> 00:06:00,710
‫แล้วเราจะรวบรวมมาให้ชมกันครับ

76
00:06:00,740 --> 00:06:08,540
‫มาเล่นกันเถอะ เข้าไปในบันทึกการส่งออกของเรา และนั่นเองครับ มันพิมพ์การอ้างอิงความเสียหายและความเสียหาย

77
00:06:08,540 --> 00:06:12,350
‫เนื่องจากทั้งคู่มีค่าใหม่ที่เราตั้งค่าเป็นห้า

78
00:06:12,350 --> 00:06:18,710
‫โดยพื้นฐานแล้ว สิ่งที่เรามีตรงนี้คือตัวแปรสองตัวที่ชี้ไปยังหน่วยความจำชิ้นเดียวกัน

79
00:06:18,710 --> 00:06:22,370
‫คุณเกือบจะพูดได้ว่ามันเป็นตัวแปรเดียวกัน แต่มีชื่อต่างกัน

80
00:06:22,370 --> 00:06:30,740
‫ดังนั้นสิ่งนี้จึงมีประโยชน์ที่ไม่จำเป็นต้องคัดลอก เช่นเดียวกับตัวชี้ แต่มันก็มีประโยชน์มากกว่านั้นอีกมากเพราะใช้งานง่ายกว่ามาก

81
00:06:30,740 --> 00:06:33,680
‫เราไม่ต้องการรูปแบบเพิ่มเติมทั้งหมด และยังปลอดภัยกว่าที่จะใช้

82
00:06:33,680 --> 00:06:39,320
‫ตราบใดที่เราไม่จำเป็นต้องชี้อะไรอีก โดยทั่วไปแล้วการใช้ข้อมูลอ้างอิงจะดีกว่า

83
00:06:39,320 --> 00:06:44,840
‫ตอนนี้ มาทบทวนกันสั้นๆ เกี่ยวกับสัญลักษณ์บางตัวที่เราใช้กันที่นี่ เพราะอาจทำให้สับสนได้เล็กน้อย

84
00:06:44,840 --> 00:06:47,240
‫มีการใช้กันอย่างแพร่หลายใน C ++

85
00:06:47,240 --> 00:06:52,520
‫แอมเพอร์แซนด์และสัญลักษณ์รูปดาว มาดูกันดีกว่าในบริบทและความหมายของมัน

86
00:06:52,790 --> 00:07:00,020
‫เมื่อเราใช้พวกมัน ดังนั้นเมื่อเราใช้มันในนิพจน์ นี่คือตัวอย่างโค้ดบางส่วน

87
00:07:00,020 --> 00:07:03,620
‫คุณอาจเห็นดาวอยู่ข้างหน้าตัวแปร

88
00:07:03,620 --> 00:07:06,410
‫คุณอาจเห็นเครื่องหมายและนำหน้าตัวแปร

89
00:07:06,410 --> 00:07:07,610
‫สิ่งนี้หมายความว่า?

90
00:07:08,240 --> 00:07:20,990
‫ด้วยสัญลักษณ์รูปดาว ไวยากรณ์ของการวางไว้ข้างหน้าตัวแปรหมายความว่าเราได้รับเนื้อหาที่ตัวชี้นักแสดงในขณะนี้ด้วยเครื่องหมายและ

91
00:07:20,990 --> 00:07:25,940
‫หากคุณใส่เครื่องหมายแอมเพอร์แซนด์ไว้หน้าตัวแปรหรือนำหน้าการอ้างอิงตัวแปร

92
00:07:25,940 --> 00:07:28,910
‫แสดงว่าได้รับที่อยู่ของตัวแปรนั้น

93
00:07:28,910 --> 00:07:32,720
‫กำลังรับที่อยู่ของนักแสดงหรือที่อยู่ตามการอ้างอิง

94
00:07:32,720 --> 00:07:41,420
‫เมื่อเราประกาศ เรากำลังใช้มันในรูปแบบของตัวแปร ดาวและเครื่องหมายและมีความหมายตรงกันข้ามเกือบ

95
00:07:41,420 --> 00:07:52,550
‫ดังนั้นดาวจึงหมายความว่านี่คือตัวชี้ไปยังนักแสดงหน้าใหม่และเครื่องหมายและหมายความว่านี่คือการอ้างอิงถึงนักแสดงหน้าใหม่

96
00:07:52,550 --> 00:08:03,500
‫จำไว้ว่ามีชุดของความหมายที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ไม่ว่าคุณจะใช้กับตัวแปรในนิพจน์หรือว่าคุณกำลังใช้ในประเภทที่ประกาศตัวแปรหรือไม่

97
00:08:03,500 --> 00:08:08,000
‫ฉันจะไม่ลงรายละเอียดมากเกินไป แต่เพื่อเพิ่มการดูถูกการบาดเจ็บ สิ่งเหล่านี้สามารถมีความหมายอื่นในบริบทอื่น

98
00:08:08,000 --> 00:08:14,240
‫ๆ ที่เครื่องหมายและอาจหมายถึงฉลาดเล็กน้อย และดาวดังที่เราได้เห็นแล้วสามารถ ใช้กับสตริงในบันทึก

99
00:08:14,240 --> 00:08:17,960
‫U

100
00:08:17,960 --> 00:08:26,600
‫ดังนั้นนี่ไม่ใช่ความหมายทั้งหมดของสัญลักษณ์ทั้งสองนี้ แต่เป็นความหมายที่สำคัญเกือบทั้งหมดที่อ้างถึงตัวชี้และการอ้างอิง

101
00:08:26,630 --> 00:08:27,320
‫สิ่งที่ดี

102
00:08:27,320 --> 00:08:32,480
‫ดังนั้น เราจึงได้เรียนรู้เกี่ยวกับพอยน์เตอร์ ข้อมูลอ้างอิง ความสัมพันธ์ระหว่างกัน ความแตกต่าง

103
00:08:32,480 --> 00:08:34,490
‫และเหตุผลที่เราอาจต้องการใช้

104
00:08:34,490 --> 00:08:36,140
‫เจอกันใหม่ตอนหน้าค่ะ

