Một lời giải thích tốt đẹp cho con trỏ là gì? [đóng cửa]


72

Trong các nghiên cứu của riêng bạn (một mình hoặc cho một lớp học) bạn đã có một khoảnh khắc "ah ha" khi cuối cùng, bạn thực sự hiểu con trỏ? Bạn có một lời giải thích bạn sử dụng cho các lập trình viên mới bắt đầu có vẻ đặc biệt hiệu quả?

Ví dụ, khi người mới bắt đầu lần đầu tiên gặp con trỏ trong C, họ có thể chỉ cần thêm &s và *s cho đến khi nó biên dịch (như bản thân tôi đã từng làm). Có thể đó là một bức tranh, hoặc một ví dụ thực sự có động lực, đã khiến con trỏ "nhấp chuột" cho bạn hoặc học sinh của bạn. Nó là gì và bạn đã thử những gì trước đây dường như không hoạt động? Có bất kỳ chủ đề tiên quyết (ví dụ: cấu trúc, hoặc mảng)?

Nói cách khác, điều gì là cần thiết để hiểu ý nghĩa của &s và *, khi bạn có thể sử dụng chúng một cách tự tin? Học cú pháp và thuật ngữ hoặc các trường hợp sử dụng là không đủ, tại một số điểm, ý tưởng cần phải được tiếp thu.


Cập nhật: Tôi thực sự thích các câu trả lời cho đến nay; hãy giữ cho họ đến Có rất nhiều quan điểm tuyệt vời ở đây, nhưng tôi nghĩ nhiều điều là những lời giải thích / khẩu hiệu tốt cho chính chúng ta sau khi chúng ta tiếp thu khái niệm này. Tôi đang tìm kiếm bối cảnh và hoàn cảnh chi tiết khi nó chợt nhận ra bạn.

Ví dụ:

Tôi chỉ hiểu phần nào về con trỏ cú pháp trong C. Tôi nghe hai người bạn của tôi giải thích về con trỏ cho một người bạn khác, người hỏi tại sao một con structđược truyền bằng một con trỏ. Người bạn đầu tiên nói về việc cần phải tham khảo và sửa đổi như thế nào, nhưng đó chỉ là một nhận xét ngắn từ người bạn khác, nơi nó đánh tôi: "Nó cũng hiệu quả hơn." Vượt qua 4 byte thay vì 16 byte là sự thay đổi khái niệm cuối cùng tôi cần.


16
Phương pháp 'Shotgun': ném * s ở mọi nơi cho đến khi nó hoạt động.
Michael K

15
@Michael: Vâng, chúc may mắn với điều đó.
Robert Harvey

8
Câu hỏi này xuất hiện ngay sau khi bắt đầu mỗi học kỳ về SO. Hóa thân mới nhất có tại đây: stackoverflow.com/questions/4118647/ từ
Tim Post

10
Một lời giải thích tốt đẹp cho con trỏ là gì? Brian Kernhigan và Dennis Ritchie ghét các kỹ sư phần mềm.
Adam Crossland

3
Nó "nhấp chuột" cho tôi sau khi đã dành một chút thời gian mã máy một bước trong trình gỡ lỗi. Vâng, tôi đã quen thuộc với những điều cơ bản về kiến ​​trúc máy tính - tôi đã học cách lắp ráp trên Commodore 64 và x86 ASM khá đơn giản sau đó. Vì vậy, tôi đã biết khái niệm về một "địa chỉ", tôi chỉ không hiểu làm thế nào nó được ánh xạ tới các cấu trúc cú pháp của C.
zvrba

Câu trả lời:


25

Sơ đồ bộ nhớ dưới dạng lưới

Thông thường những gì tôi làm là biểu diễn bộ nhớ dưới dạng "lưới", để tôi có thể tạo địa chỉ, làm nổi bật các không gian bộ nhớ khác nhau và ghi vào các giá trị ô (hoặc thậm chí xa hơn, biểu diễn nhị phân của chúng) và liên kết các con trỏ trong bộ nhớ với các giá trị chúng chỉ vào. (Và sau đó vẫn đề cập rằng đó là một sự đơn giản hóa).

Thông thường đó là khoảnh khắc "ohhhh" đối với hầu hết các học sinh của tôi.

Biểu tượng tung hứng

Sau đó, khi nói đến việc họ ngừng quên cách sử dụng & và *, điều đó rất đơn giản: trình bày nó giống như cách họ thực hiện các phép tính toán học hoặc vật lý. Nếu bạn chia khoảng cách tính bằng km cho thời gian tính theo giờ, bạn sẽ có được tốc độ tính bằng km / h. Có gì cần phải ra ngoài. Đơn giản.

in ra để giải cứu

Chỉ thực hiện một vài ví dụ cơ bản thể hiện trực quan những gì bạn đã giải thích với những điều này sẽ giúp họ thoải mái trong những gì họ nghĩ họ hiểu hoặc cho họ cơ hội để nói "ah, tôi không hiểu điều này".

Mở rộng

Con trỏ che cho các loại đơn giản và đảm bảo rằng chúng hiểu sự khác biệt giữa địa chỉ và kích thước của một loại dữ liệu, sau đó cấu trúc, sau đó là mảng và nhiều cấp độ.

Sau đó bắt đầu số học con trỏ.


Phụ lục: Đệ quy

Tôi thường giải thích đệ quy tương tự, sử dụng một biểu diễn trực quan. Yêu cầu họ in bảng chữ cái bằng cách sử dụng chức năng được tạo sẵn để viết một ký tự đơn, sau đó yêu cầu họ in theo thứ tự ngược lại bằng cách chỉ thay đổi hai dòng.

Thông thường có một "cái gì ...?" Khoảnh khắc và khi bạn chỉ thêm một tham số khác vào printf của mình để in các giá trị số và thụt các bước, nó sẽ trở thành một tiếng thở phào nhẹ nhõm.


Lựa chọn thay thế: Mô hình Play-Doh và Cup nước

Tôi thực sự đã có một số đồng nghiệp trong một trường đại học đã cho sinh viên xem một video giải thích các con trỏ và truy cập bộ nhớ bằng cách sử dụng dán play-doh. Nó cực kỳ thông minh và được thực hiện tốt, mặc dù tôi chưa bao giờ thực sự sử dụng kỹ thuật đó cho mình, ngoại trừ những người học rất trẻ thích nắm bắt lập trình (nhưng thường thì những người tôi sẽ không hướng họ đến ngôn ngữ bằng cách sử dụng con trỏ quá sớm). Về cơ bản sử dụng những quả bóng play-doh nhỏ mà bạn có thể gắn vào những quả bóng play-doh lớn hơn khác đại diện cho không gian bộ nhớ và bạn có thể kết hợp với nhau để liên kết chúng (như trong cấu trúc dữ liệu được liên kết) hoặc hợp nhất với nhau (như tiếp giáp nhau không gian bộ nhớ). Sử dụng các màu khác nhau cho các không gian bộ nhớ được trỏ đến và các con trỏ cũng giúp. Nhưng tôi vẫn nghĩ rằng bộ nhớ như một mạng lưới hoạt động tốt hơn, như bạn có thể thấy rõ rằng việc chỉ điểm thực sự là vấn đề "giải quyết", như trên "bản đồ / lưới". Trong khi đó, chế độ Play-doh vẫn khiến họ nhầm lẫn rằng mọi thứ thực sự "chạm" vào nhau trong bộ nhớ.

Thứ Water Cup cũng được một đồng nghiệp sử dụng trực tiếp, nhưng tôi không biết liệu cô ấy có nghĩ ra nó không. Đó là một cách tiếp cận thú vị, nhưng tôi nhận thấy nhiều sinh viên đã bị bối rối bởi lời giải thích. Một cái gì đó tương tự như kỹ thuật Coffee Cup của DevSolo . Nhưng tôi nghĩ rằng nó thực sự là một sai lầm khi bạn làm cho các sinh viên nhầm lẫn giữa các thùng chứa, cấu trúc dữ liệu, con trỏ và mảng. Nó có thể là một cách tiếp cận thú vị để giải thích các mảng lúc đầu tôi giả sử, nhưng tôi sẽ không gắn bó lâu dài.


Wow, cảm ơn vì tiền thưởng. Vui mừng câu trả lời đã được đánh giá cao.
haylem

Vẽ nó ra: | Nghe có vẻ như một bài giảng hay!
Spooks

80

Một người khôn ngoan hơn tôi từng nói:

Nữ tu Wu Jincang đã hỏi Ngài Patriach Huineng thứ sáu, "Tôi đã nghiên cứu kinh điển Mahaparinirvana trong nhiều năm, nhưng có nhiều lĩnh vực tôi không hiểu lắm. Xin hãy khai sáng cho tôi."

Người yêu nước trả lời: "Tôi không biết chữ. Xin vui lòng đọc các ký tự cho tôi và có lẽ tôi sẽ có thể giải thích ý nghĩa."

Nữ tu nói, "Bạn thậm chí không thể nhận ra các ký tự. Làm thế nào bạn có thể hiểu ý nghĩa?"

"Sự thật không liên quan gì đến lời nói. Sự thật có thể được ví như mặt trăng sáng trên bầu trời. Từ ngữ, trong trường hợp này, có thể được ví như ngón tay. Ngón tay có thể chỉ vào vị trí của mặt trăng. Tuy nhiên, ngón tay không phải là Mặt trăng. Để nhìn lên mặt trăng, cần phải nhìn ra ngoài ngón tay, phải không? "


13
+1 cho hội thảo mặt trăng. +1 cho công án, nếu tôi có thể.
Tim Post

14
Âm thanh của một ngón tay nâng cao là gì?
Adam Crossland

3
@Adam tùy thuộc vào việc bạn đang sử dụng chuột hay bàn di chuột.
Daniel Joseph

7
@Frank Đó là một trích dẫn TUYỆT VỜI. Tuy nhiên, tôi nghĩ rằng nó sẽ không giúp nắm bắt ý tưởng. Đặc biệt với một người mới để con trỏ.
Gul Sơn

11
Đây là một câu chuyện hay ... nhưng tôi nghi ngờ rằng mọi người đang bỏ phiếu vì điều đó, hơn là vì nó giải thích rõ về con trỏ.
Kyralessa

46

Tôi thấy rằng sơ đồ là rất hữu ích. Thí dụ:

sơ đồ con trỏ


Kiểu sơ đồ này giúp tôi thấy rằng các con trỏ là biến của riêng chúng, nhưng chứa một giá trị là vị trí của một đối tượng khác, tức là mảng hoặc chuỗi. Ngoài ra, khi thực hiện bằng bút chì, tôi có thể sử dụng nó để theo dõi chương trình của mình trên giấy hoặc trên bảng / bảng trắng.


4
Giá trị trong "con trỏ" phải là 4 hoặc các chỉ số mảng (hoặc địa chỉ bộ nhớ) phải bắt đầu từ 0. Nếu không, làm thế nào một con trỏ giữ giá trị 3 điểm đến vị trí 4?
MAK

++ Đây chính xác là cách tôi sẽ giải thích nó. Tôi bắt đầu ở Fortran (tốt hơn hoặc xấu hơn!). Trong Fortran, từ đó trở đi, chúng tôi đã sử dụng các mảng song song thay vì các mảng cấu trúc (không có thứ gì mới như vậy ). Nếu một mảng chứa chỉ mục "hàng khác" trong mảng, chúng tôi gọi đó là "con trỏ" và điều này thật thú vị. Chúng tôi lập danh sách liên kết, cây, bạn đặt tên cho nó.
Mike Dunlavey

2
Tôi tìm thấy con trỏ giải thích tốt nhất bằng cách sử dụng hình ảnh chỉ ra những gì được lưu trữ ở đâu và mũi tên để chỉ ra nơi con trỏ trỏ.
gablin

32

Khi tôi lần đầu tiên "học" về con trỏ, tôi đã bị đẩy vào đó. Trường đại học của tôi đã đưa ra quyết định từ lâu trước khi tôi đăng ký tập trung vào chương trình giảng dạy quanh Java, vì vậy khi giáo sư Cấu trúc dữ liệu của tôi giảng một bài về C và yêu cầu chúng tôi thực hiện Danh sách XOR với các gợi ý tôi cảm thấy như mình đang tham gia vào một cái gì đó cách trên đầu của tôi.

Tôi hiểu định nghĩa:

Một con trỏ là một biến chứa địa chỉ của một biến

Nhưng tôi vẫn không hiểu một phần lớn của khái niệm này. Nhìn lại, tôi nghĩ nó tập trung vào ba điều:

  1. Chính xác thì vị trí bộ nhớ là gì? (Tại thời điểm đó tôi không tham gia lớp Tổ chức Máy tính)

  2. Cú pháp vụng về (Vậy ừm ... tại sao chính xác nó được định nghĩa như "int * ip" nhưng sau đó tôi gọi biến là "ip"?)

  3. Làm thế nào chính xác là có lợi để lưu trữ địa chỉ của một biến thay vì chỉ sử dụng biến?

Mãi cho đến khi tôi mua cuốn sách K & R và hoàn thành mọi vấn đề mà tôi thực sự nắm bắt được về con trỏ. Bên cạnh thực tế là tôi đã hoàn thành lớp Tổ chức Máy tính từ lâu (mà tôi nghĩ là cần thiết trước khi học C), một phần của nó phải làm với thực tế là tôi nhận ra rằng con trỏ có thể được sử dụng cho các hàm, mảng, cấu trúc ... để làm những việc hữu ích và không chỉ đơn thuần là lưu trữ cho địa chỉ của các biến thông thường.

Nhưng khoảnh khắc "aha" của tôi cho đến nay là cách K & R giải thích cú pháp khó xử khi xác định một con trỏ đơn giản. Tôi đã ghi chú trong suốt cuốn sách (trong đó tôi viết lại các điểm được tạo ra bởi cuốn sách theo từ của riêng tôi để hiểu thêm) và đây là một trong những điều liên quan đến điều đó:

Một con trỏ là một biến chứa một địa chỉ cho một biến. Một con trỏ vừa được xác định vừa được hủy đăng ký (mang lại giá trị được lưu trữ tại vị trí bộ nhớ mà nó trỏ đến) với toán tử '*'; các biểu hiện là ghi nhớ.

Ex.: 
   int a;      /* Variable 'a' is an integer */

   int *ip;   /* Variable ip is a pointer and dereferencing it gives an integer.
                 In other words, the expression *ip is an int, so ip is a pointer
                 to an int */

Tôi đã luôn cảm thấy rằng tôi không thể hoàn toàn nắm bắt được các khái niệm tiên tiến hơn về con trỏ cho đến khi tôi có một thứ gì đó quá sâu sắc trong đầu. Nó đã làm phiền tôi vô tận sau nhiệm vụ đó (nhân tiện tôi không làm tốt lắm;)) tại sao "* ip" không tồn tại ngay sau khi tôi (nghĩ rằng tôi) định nghĩa "* ip". Nắm vững điều này là điều cần thiết cho các khái niệm nâng cao hơn liên quan đến con trỏ, như con trỏ hàm và các định nghĩa phức tạp hơn như thế này:

char (*(x())[])()

Nói chung, tôi nghĩ khái niệm con trỏ đòi hỏi:

  1. Một sự hiểu biết cơ bản về cách bộ nhớ được đặt ra trong một máy tính (và bộ nhớ là gì).

  2. Kiến thức về cách con trỏ mạnh mẽ có thể (sử dụng trong thế giới thực, không chỉ là một khái niệm trừu tượng khác mà chúng học vì lợi ích của việc học).

  3. Giải mã chữ tượng hình thông thường được gọi là "định nghĩa của một con trỏ"

Vì vậy, tất cả trong tất cả, tôi nghĩ nên có ít nhất 3 khoảnh khắc "aha" khi tìm hiểu về con trỏ. Tôi vẫn còn là một sinh viên nên tôi nghĩ bạn sẽ đánh giá cao quan điểm của một người vẫn còn (tương đối) mới học khái niệm này.


+1 cho 3 "Ah ha!" tu sĩ. Con trỏ Groking đến trong lớp. Tôi đã "hiểu" các điểm trong một thời gian dài trước khi tôi nhận ra tôi chỉ hiểu được một nửa con trỏ đến con trỏ :)
Binary Worrier

Tôi nghĩ rằng bạn hoàn toàn chính xác ở chỗ một phần rất lớn của 'không hiểu con trỏ' thực sự là vấp phải cú pháp C kỳ lạ. [Suy nghĩ: Tôi tự hỏi sẽ khó khăn thế nào khi mò mẫm với loại cú pháp này: PointerTo<int> a]
Stewol

Đồng ý, @Benjol. Tôi ngạc nhiên rằng cú pháp int* ipkhông phổ biến hơn. Cuối cùng tôi đã bắt đầu hiểu con trỏ một khi tôi thấy mã được định dạng như thế này. Sau đó tôi có thể đọc nó là "ip thuộc kiểu con trỏ int."
Jacob

19

Con trỏ hơi giống với các phím tắt ứng dụng trên máy tính để bàn của bạn. Xóa các phím tắt và mục tiêu vẫn tồn tại. Bắt đầu các phím tắt và mục tiêu được bắt đầu.

Tôi luôn giải thích công việc này bằng cách đơn giản tạo một tệp txt trên máy tính để bàn của tôi và hai phím tắt đến tệp. Sau khi sao chép và xóa các phím tắt, bạn có thể thấy mọi người hiểu ý tưởng đằng sau 'tài liệu tham khảo'.

Khi nhóm hiểu được cơ bản đằng sau các phím tắt, bạn có thể bắt đầu giải thích các con trỏ bằng mọi cách bạn muốn. Họ có thể sẽ hiểu nó khá dễ dàng.


Đó không phải là một tương tự xấu. Chỉ cần thêm một vài điểm để bất kỳ ai thực hiện điều này theo nghĩa đen là "liên kết cứng" sẽ luôn trỏ đến mục tiêu của nó ngay cả khi nó thay đổi thư mục, một con trỏ sẽ trỏ đến bộ nhớ ban đầu ngay cả khi đối tượng đã được di chuyển. Một "liên kết cứng" sẽ cho bạn biết khi mục tiêu không còn tồn tại, một con trỏ con trỏ lơ lửng nên được đặt thành NULL.
snmcdonald

Một liên kết cứng giống như một tham chiếu đếm con trỏ thông minh
jk.

1
+1. Một trong những tương tự thực tế tốt nhất để giải thích con trỏ. Tôi chắc chắn rằng sinh viên sẽ có được ý tưởng ngay lập tức vì chức năng này được mọi người sử dụng phổ biến nhất.
Karthik Sreenivasan

13

8-10 năm trước, tôi đã dạy một khóa học "C" giới thiệu tại một trường cao đẳng cộng đồng. Đây luôn luôn là một chủ đề thú vị để khám phá. Điều có vẻ hoạt động tốt nhất, và điều này là sau khi thảo luận với đồng nghiệp một vài lần là sử dụng cốc cà phê và bàn tay của bạn.

Tôi đã sử dụng sự tương tự của một tách cà phê (hoặc hàng của chúng cho các mảng) như là một biến (nó có thể chứa một cái gì đó). Sau đó, tôi đã sử dụng bàn tay của mình, cũng có thể giữ một cái gì đó hoặc, bằng cách mở rộng ngón trỏ của mình để "chỉ vào" một tách cà phê.

Một bàn tay gần gũi là vô giá trị, một ngón tay chỉ vào đầu tôi (giống như một khẩu súng giả) là một con trỏ lơ lửng.

Sau đó, với một vài cuộc biểu tình và các chuyến đi thông qua trình gỡ lỗi, nó đã nhấp vào hầu hết.


3
Bạn đã làm tôi bối rối.
kirk.burleson

1
@Kirk, làm sao vậy? để tôi xem nếu tôi có thể làm rõ nó
DevSolo

4
++ Không có gì giống như dạy để khiến bạn nghĩ về những điều này.
Mike Dunlavey

Một trong những giảng viên của tôi ở trường đại học đã làm một điều tương tự, sử dụng sinh viên (một trong số đó là "Niel", để cười thêm), thay vì cốc cà phê. Chỉ tay vẫy tay với khán giả là một con trỏ lơ lửng, bởi vì nó có thể chỉ vào bất cứ thứ gì.
Kaz Dragon

2
Một con trỏ lơ lửng giống như chỉ vào Neil sau đó khiến anh ta rời khỏi ghế mà không thay đổi nơi bạn đang chỉ ... sau đó cố gắng đi theo con trỏ đó và diễn giải những gì bạn tìm thấy ở đó như một Neil bất kể ai kết thúc ở đó.
Jon Purdy

10

Tôi thực sự khá lo lắng khi nghe câu hỏi "làm thế nào bạn nắm bắt được con trỏ". Tôi luôn nghĩ rằng khái niệm này cực kỳ đơn giản và một sự phát triển logic của các ngôn ngữ cung cấp sức mạnh lớn cho các lập trình viên.

Điều làm tôi lo lắng là tôi không bao giờ thấy khó hiểu về khái niệm con trỏ. Vì vậy, khi bạn ở đây "khi nào bạn cuối cùng đã nhận được nó" nhiều lần, bạn bắt đầu nghĩ:

Tôi có thực sự nhận được nó? Có lẽ tôi chưa bao giờ làm?

Có lẽ lý do tại sao khái niệm này có vẻ khó, là bởi vì chúng tôi tiếp tục nói với tất cả những người chưa gặp họ rằng con trỏ rất khó, và đây là một trăm cách bạn có thể học?

Chỉ cần đưa ý tưởng đó ra, tất nhiên cá nhân tôi thích một sơ đồ tốt và Steve Gibson luôn làm tốt công việc giải thích mọi thứ !


Thú vị ... bạn đã sử dụng ngôn ngữ nào vào thời điểm đó? Tôi nghĩ rằng cú pháp C đi lên rất nhiều người. Nếu bạn biết lắp ráp đầu tiên tôi có thể thấy đó là một lý do. [BTW, tôi muốn bỏ phiếu này, nhưng tôi đã đạt được giới hạn của mình cho ngày hôm nay.]
Macneil

Thật thú vị, tôi đã không có kiến ​​thức về con trỏ "nguy hiểm" trong một thời gian dài, làm việc với Python (và Java tại Đại học). Sau đó, tôi lấy một mô-đun "phương pháp hướng đối tượng" sử dụng C ++ làm ngôn ngữ được lựa chọn và đi thẳng vào đó.
Marcus Whybrow

Ngoài ra tôi nghĩ rằng việc hiểu một chương trình được thể hiện trong bộ nhớ chắc chắn có thể giúp ích như thế nào, nhưng tôi nghĩ rằng tôi muốn nói rằng việc hiểu tại sao con trỏ là một bổ sung hữu ích cho ngôn ngữ, là góc độ hiệu quả nhất, vì bạn cũng đang trải qua điều tương tự xử lý như các nhà thiết kế ban đầu.
Marcus Whybrow

+1 Tôi không biết tại sao mọi người nghĩ rằng con trỏ là khó khăn hoặc bí ẩn.
ggambett

Vâng, con trỏ luôn rõ ràng đơn giản và hữu ích đến mức tôi không thể tưởng tượng được rằng có bất cứ điều gì "khó" về chúng. Tôi ghét nó khi một giáo viên của bất kỳ khóa học nào nói "bây giờ, điều này là một chút khó khăn" bởi vì nó chỉ là lật đổ. Chỉ cần dạy những thứ chết tiệt, và để học sinh tự quyết định xem họ có nghĩ nó khó không.
Jon Purdy

7

Tôi chưa bao giờ gặp vấn đề với con trỏ trong C, nhưng điều đó có thể là do tôi phải học trình biên dịch trước. Thật là nhẹ nhõm khi không phải tự mình quản lý địa chỉ nữa. Vì vậy, có lẽ câu trả lời (giả sử đây là điều bạn đang dạy) là cung cấp cho sinh viên một ngôn ngữ lắp ráp mô phỏng để làm việc. Họ sẽ tìm ra nó trong quá trình viết bất cứ thứ gì tinh vi hơn "Xin chào, thế giới".


+1 để điều chỉnh một sự trừu tượng nguyên thủy hơn, thay vì cố gắng sử dụng một sự tương tự.
Loại ẩn danh

Ở trường trung học của tôi, một đơn vị Nghiên cứu Máy tính đã dành cho việc nghiên cứu một máy tính hộp diêm , có thể được dạy từ bảng đen mà không bao giờ chạm vào hoặc liên quan đến một máy tính thực sự.
rwong

@Larry Coleman, hội !!!!!!!!!!! Tôi muốn thử nó trước khi C. Xin vui lòng cho tôi biết nơi bắt đầu học. Ebooks miễn phí, PDF miễn phí? Ý tưởng? Xin vui lòng!!!!!!!!!!!!!!!!!!!
Spacez Ly Wang

7

Một con trỏ là một biến có giá trị là địa chỉ bộ nhớ của một biến khác.


Thanh lịch, tại sao làm cho nó phức tạp hơn.
Bjarke Freund-Hansen

Nếu con trỏ dường như không trực quan và hữu ích ngay lập tức, thì chúng đã bị giải thích sai.
Jon Purdy

6

Làm thế nào tôi thực sự học về con trỏ? Bằng cách viết một trình biên dịch sinh viên năm nhất đại học.

Làm thế nào để giải thích con trỏ trong các điều khoản của giáo dân? Tôi thích sự tương tự (ngày?) Của một danh mục thư viện được lưu trữ trên thẻ chỉ mục. Mỗi thẻ ("con trỏ") chứa thông tin về vị trí của một số sách ("dữ liệu"), nhưng thực tế không chứa chính cuốn sách đó. Nếu bạn sửa đổi thẻ ("số học con trỏ"), tất cả những gì nó làm là thay đổi cuốn sách mà nó trỏ đến và không có tác động đến chính cuốn sách - chỉ cần cẩn thận không làm hỏng địa chỉ hoặc bạn có thể trỏ đến một cuốn sách không tồn tại hoặc thậm chí là thư viện sai. Tuy nhiên, nếu bạn theo dõi "địa chỉ" trên thẻ và đi đến phần thích hợp của thư viện ("dereference con trỏ"), bạn có thể xem / sửa đổi chính cuốn sách.


+1 cho bộ nhớ về khóa học CS của tôi, nơi tôi có chính xác lời giải thích đó
Gary Rowe

Điều đó tốt theo một cách nào đó, nhưng hơi sai lệch, vì các thẻ không thực sự nói cuốn sách đó ở đâu . Bạn vẫn cần phải thực hiện thuật toán tìm kiếm theo hướng sneaker. Có lẽ điều này tốt hơn mô hình một cơ sở dữ liệu - tham chiếu đến một đối tượng được lưu trữ bằng một khóa (số cuộc gọi).
DarenW

+1 Sự tương tự vẫn giữ nguyên khái niệm giống như khái niệm được giải thích bởi Barfieldmv nhưng với cách tiếp cận thực tế hơn.
Karthik Sreenivasan

5

Tôi sẽ giả sử ai đó sẽ học con trỏ biết các biến thông thường là gì và cách chúng hoạt động trong C. Bây giờ, hãy thử xác định các con trỏ với một số thuộc tính của nó-

  • Chúng cũng là các biến, nhưng có bản chất khác nhau. Giả sử có hai lớp trong không gian biến. Các biến thông thường của các loại khác nhau nằm ở lớp trên và con trỏ ở lớp dưới. Giống như con số này-

    văn bản thay thế

  • Như tên 'Con trỏ' gợi ý, con trỏ có thể ĐIỂM một cái gì đó. Giống như ngón tay của chúng ta có thể chỉ vào một số đối tượng. Những điều họ chỉ đến là gì? Đây là các biến bình thường. Nói tóm lại, "Con trỏ trỏ đến các biến thông thường".

  • Giống như các biến thông thường, con trỏ cũng có cùng số loại như int, char hoặc float. Và một con trỏ của một loại cụ thể có thể chỉ đến cùng một loại biến.
  • Một con trỏ có thể trỏ đến một biến và sau đó cùng một con trỏ có thể trỏ đến một biến khác. Chỉ là loại nên giống nhau. Vì vậy, liên kết của một con trỏ với một số biến không phải là vĩnh viễn và có thể thay đổi.
  • Vì vậy, làm thế nào một con trỏ được khai báo? Gần giống như các biến thông thường. Bạn phải đặt trước tên bằng dấu hoa thị ( *). Như-

    int *pointer;
    
  • Sau đó, làm thế nào một con trỏ được liên kết với một biến? Sử dụng &toán tử trước biến như câu lệnh này-

    pointer = &variable;
    
  • Làm thế nào một con trỏ được sử dụng bằng cách chỉ vào một biến? Điều này cũng được thực hiện bằng cách đặt trước tên bằng dấu hoa thị ( *). Sau đó, nó có thể được sử dụng ở vị trí của biến mà nó đang chỉ bây giờ-

    *pointer = var1 + var2;
    

    thay vì

    variable = var1 + var2;
    
  • Bây giờ, chơi với con trỏ với một số mã. Bây giờ chỉ cần làm quen với đặc điểm này của con trỏ. Cho đến thời điểm này, chúng ta đang nói về những gì con trỏ làm. Khi bạn đã ổn với nó, sau đó bắt đầu nghiên cứu cách con trỏ trỏ đến một số biến và cách chúng phản ứng nếu các phép toán số học thông thường được áp dụng trên chúng. Sau đó đi đến mối quan hệ giữa con trỏ và mảng và con trỏ đến con trỏ.

Đó là tất cả tôi sẽ đề nghị về con trỏ học tập.


Tôi muốn làm theo quy trình "đầu tiên nó làm gì sau đó như thế nào". Trừu tượng!
Gul Sơn

5

Chỉnh sửa để hỗ trợ các yêu cầu sửa đổi của câu hỏi

Con đường của tôi để hiểu "con trỏ bài" (nếu tôi nhớ chính xác) đã đi như thế này. Tôi đã có một số kinh nghiệm đơn giản về lập trình lắp ráp từ khi tôi còn đang tìm hiểu về BBC Micro vì vậy tôi có khái niệm về bộ nhớ là một loạt các hộp (xem bên dưới để biết điều này). Điều này đã được củng cố bằng cách sử dụng các mảng. Tuy nhiên, tôi đã đi vào thế giới của C và phải đối phó với các chuỗi và điều đó có nghĩa là con trỏ. Trong BASIC, điều này là không quan trọng, trong trình biên dịch chương trình, tôi không bao giờ phải làm việc với chúng, và bây giờ trong C cổ điển, tất cả đều là con trỏ và công cụ. À, nhưng tôi có thể quay lại các mảng với các chuỗi (null đã kết thúc) như thế này:

char s[] = "Hello, world!";
printf("%s",s);

Tất cả đều tốt và tốt, đó chỉ là một mảng ký tự (8 bit cho mỗi ký tự trong thế giới nhỏ bé của tôi) với ký tự 0 ở cuối để hiển thị nơi kết thúc. Printf chỉ cần lấy mảng đó và chạy qua nó in nó. Nhưng nếu tôi muốn truyền chuỗi này vào một hàm thì sao?

void print_str(char* p) {
  printf("%s",p);
}

Là những gì hướng dẫn sử dụng nói, nhưng những gì * tất cả về? Hmm, char * có nghĩa là "con trỏ tới char". OK ... mất tôi. Sau đó, tôi nhận ra rằng char * làm cho p tương đương với s [0]. OK, tôi có thể sử dụng nó, nhưng tôi vẫn chưa hiểu được con trỏ là gì. Ý tôi là, làm thế nào để tôi thiết lập một số dữ liệu với một trong những điều này? Tắt hướng dẫn sử dụng một lần nữa ...

char* p = "Hello World!";

Khi tôi viết ở trên, tôi tự nói với bản thân mình "khai báo một con trỏ tới char và đặt nó bằng với mảng ký tự này". Bằng cách nào đó, con trỏ không cần đến một mảng. Đoán đó là trình biên dịch làm một số thứ cho tôi để thay đổi. Vậy làm thế nào tôi có thể thay đổi mảng với con trỏ này? Tôi biết rằng tôi có thể sử dụng phiên bản mảng

 s[2] = 'L'; 

nhưng những gì tương đương trong "con trỏ nói"? Tắt hướng dẫn đó một lần nữa ...

*(p+2) = 'L';

Tôi cho rằng * đơn giản có nghĩa là "nội dung của địa chỉ bộ nhớ" và (p+2)s[2]. Điều đó có nghĩa là con trỏ p chỉ ... một ... địa chỉ ... bong!

Đó là âm thanh của sự giác ngộ. Tôi đột nhiên vặn vẹo con trỏ (cách đây đã lâu, chúng ta đã không "mò mẫm" cho đến sau này). Đó chỉ là sự thiếu quyết đoán.


Nguyên:

OK, giá trị 2c của tôi:

Hãy tưởng tượng bộ nhớ là một loạt các hộp. Mỗi hộp có một số ở bên cạnh (địa chỉ). Mỗi hộp chứa một số (nội dung). Bạn có thể làm việc với các hộp này theo 2 cách: biến (tôi muốn nội dung của hộp N), con trỏ (tôi muốn nội dung của hộp bất cứ thứ gì có trong hộp N ). Con trỏ chỉ đơn giản là vô cảm.

Và đối với câu trả lời lớn bao gồm mọi thứ bạn cần biết - hãy đọc nó .


++ Đó ít nhiều là cách tôi dạy môn học.
Mike Dunlavey

Chỉnh sửa bài viết để hỗ trợ các yêu cầu OP.
Gary Rowe

Hướng dẫn nào bạn đã sử dụng có thêm các ký tự NUL ở cuối chuỗi của bạn?
Rob Gilliam

@raimesh Một cái rất cũ (khoảng năm 1991). Không thể nhớ được.
Gary Rowe

Năm 1991? Điều đó không cũ đối với hướng dẫn sử dụng ngôn ngữ C - phiên bản đầu tiên của K & R đã được xuất bản vào năm 1978! Chỉ cần tò mò rằng đã từng có một hướng dẫn sử dụng ngoài đó đề nghị bạn cần đặt \ 0 ở cuối các hằng chuỗi của bạn. (Trên thực tế, nhìn lại lần nữa, ý bạn là đặt \ n?)
Rob Gilliam

4

Lấy một số khối gỗ nhỏ.

thêm móc kim loại vào một đầu và mắt kim loại ở đầu kia.

bây giờ bạn có thể thực hiện một danh sách được liên kết trong những thứ bạn có thể chơi với.

Hãy thử giải thích với chỗ dựa vật lý này. Tôi thường ước mình có được điều này khi dạy con trỏ cho sinh viên năm thứ nhất (sinh viên năm nhất).

Cái móc kim loại nhỏ là con trỏ, khối gỗ thứ được chỉ vào.

Tôi DEFY bất cứ ai để không nhận được nó sau khi chơi với các khối.


4

Tôi đã làm cho cuộc sống của mình dễ dàng hơn khi tôi loại bỏ tất cả lông tơ và bắt đầu coi con trỏ như bất kỳ biến nào khác thay vì một thực thể ma thuật nào đó (từ lâu ở lớp 11) .. chỉ cần biết 3 điều:

  1. Con trỏ là một biến lưu trữ địa chỉ của một biến khác (hoặc chỉ bất kỳ địa chỉ nào).
  2. * được sử dụng để lấy giá trị tại vị trí bộ nhớ được lưu trong biến con trỏ.
  3. & toán tử cung cấp địa chỉ của một vị trí bộ nhớ.

Phần còn lại là đường cú pháp và lẽ thường .. Chỉ cần viết một số chương trình C đơn giản (như triển khai thư viện danh sách được liên kết) bằng cách sử dụng con trỏ để hiểu rõ hơn.


2
  1. Con trỏ có thể được coi là một khái quát của một chỉ mục thành một mảng.
    • Hãy xem xét rằng một mảng lớn có thể được cắt nhỏ thành một số mảng nhỏ hơn, không chồng chéo, có kích thước thay đổi. Bây giờ, các mảng nhỏ hơn là những gì chúng ta thường nghĩ là mảng. Cái lớn hơn là toàn bộ không gian bộ nhớ của máy tính. Quá trình cắt bỏ các mảng nhỏ hơn được gọi là cấp phát bộ nhớ.
  2. Một tập hợp các cấu trúc được liên kết với nhau bởi một số con trỏ có thể được coi là một biểu đồ có hướng .
    • Mỗi đỉnh là một biến có thể giữ một số giá trị.
    • Một số biến là con trỏ và mỗi con trỏ có thể có chính xác một cạnh đi vào một thứ khác.
    • Các biến không phải là con trỏ sẽ không có bất kỳ cạnh nào. Họ có thể có bất kỳ số lượng cạnh đến.

2

Tôi không thể nhớ được hoàn cảnh xung quanh con trỏ của mình, nhưng tôi đã hồi phục lại bộ nhớ xung quanh sự hiểu biết của tôi về một mảng kiểu c. (tức arr[3]là giống như *(arr+3))

Vì một số lý do, tôi thấy rất hữu ích khi xem con trỏ dưới dạng mảng bất cứ khi nào tôi gặp tình huống con trỏ.


2

Về cơ bản @Gary Rowe đã giới thiệu đúng mô hình. Bộ nhớ như một tập hợp các hộp có địa chỉ (số) trên đó. Mỗi hộp lưu trữ một giá trị (số).

Ý tưởng của một con trỏ là diễn giải giá trị trong một hộp là địa chỉ của một hộp khác. Giá trị này được sử dụng để chỉ một hộp cụ thể, đó là lý do tại sao nó được gọi là tham chiếu . Như vậy dereferencing là quá trình mở hộp được giới thiệu đến.

if vlà một biến (hộp), thì câu lệnh

  • vcó nghĩa là giá trị của v, tức là cho tôi những gì trong hộp
  • *vcó nghĩa là quy định giá trị của v, nghĩa là cho tôi những gì trong hộp được giới thiệu bằng giá trị củav
  • &vcó nghĩa là tham chiếu v, tức là cho tôi địa chỉ trên hộp

Tôi nghĩ nó không phục vụ mục đích giới thiệu con trỏ như một thứ hoàn toàn khác. Đó là một khái niệm khó nắm bắt đối với tôi khi tôi còn là một đứa trẻ. Nó luôn có vẻ như là một phép thuật đen tối mà tôi chưa bao giờ thực sự hiểu, cần rất nhiều nhân vật đặc biệt. Lần đầu tiên tôi hiểu là khi tôi viết một trò chơi nhỏ bằng cách sử dụng hai lần trong một ngôn ngữ không có mỹ phẩm con trỏ. Điều đó đã khai sáng cho tôi.

Con trỏ là một vấn đề giải thích. Tôi nghĩ rằng giải thích điều đó làm cho mọi thứ dễ dàng hơn nhiều. Và con trỏ mỹ phẩm là các hoạt động cực kỳ đơn giản và trực quan nếu hiển thị một ví dụ đơn giản với bộ nhớ gồm 10 biến.


2

Lời giải thích mà tôi thực sự đã đưa ra là:

Hãy xem xét một mạng lưới thành phố với những ngôi nhà khác nhau được xây dựng trên những mảnh đất. Trong tay bạn cầm một tờ giấy. Trên giấy bạn đã viết:


Nhà của David,

112 Vì vậy, đường phố.


Mảnh giấy (biến con trỏ) chứa một địa chỉ trỏ đến nhà của David. Khi bạn muốn nói với một người bạn hãy nhìn vào ngôi nhà mát mẻ của David, việc sử dụng tờ giấy làm tài liệu tham khảo cho ngôi nhà sẽ dễ dàng hơn nhiều so với việc gửi tòa nhà hai tầng thực sự trong thư.

Như với con trỏ thực, bạn có thể gặp một số rắc rối khi bạn theo dõi địa chỉ trên mảnh giấy của bạn. David có thể đã di chuyển và khi bạn đến đó, bạn chỉ cần tìm thấy một lỗ hổng lớn trên mặt đất. Trong trường hợp này, tốt hơn hết là xóa địa chỉ trên tờ giấy khi David di chuyển hoặc ít nhất là thay đổi nó thành địa chỉ mới. Bạn cũng có thể thấy rằng bạn đến địa chỉ và nhập những gì bạn nghĩ là phòng khách của bạn David nhưng lần này bạn kết thúc ở một bể bơi hoàn toàn xa lạ. Một số người khác đã sử dụng không gian tại địa chỉ mà bạn có cho một cái gì đó hoàn toàn khác.


2

Nếu bạn muốn giải thích con trỏ, bạn phải giải thích bộ nhớ trước. Tôi thường làm điều đó bằng cách sử dụng biểu đồ giấy / bình phương với các hàng và cột. Nếu "học sinh" hiểu bộ nhớ, cô ấy có thể hiểu địa chỉ là gì. Nếu bạn có địa chỉ, bạn có con trỏ.

Bạn có thể chơi với sự trừu tượng này. Ví dụ, viết địa chỉ (số) của một hình vuông vào một hình vuông khác. Bây giờ vẽ một mũi tên từ hình vuông con trỏ đến hình vuông đích. Bây giờ ghi đè con trỏ (ví dụ: tăng nó) và điều chỉnh mũi tên. Viết một địa chỉ vào một hình vuông khác và để học sinh vẽ mũi tên ...

Bước tiếp theo: Đặt tên cho một số hình vuông nhất định (như con trỏ). Bây giờ bạn có thể giải thích hội nghị. Đó là nó.


2
Nhắc nhở tôi về một "máy tính" tôi đã sử dụng trước khi tôi có thể chạm tay vào một cái mà thực sự sử dụng các điện tử - bìa cứng "CARDIAC" tôi nghĩ rằng nó được gọi. Theo nghĩa đen, viết số trong các hộp được đánh số để lấy số từ các hộp được đánh số khác. Đó giáo dục và tôi không bao giờ gặp khó khăn khi hiểu con trỏ trên bộ vi xử lý thực sự.
DarenW

2

Có lẽ đó chỉ là tôi, nhưng tôi làm việc tốt với các chất tương tự. Vì vậy, giả sử bạn có một người bạn (chức năng / lớp) "Foo", người muốn có người khác (chức năng / lớp khác), "Bar", liên hệ với bạn vì một số lý do. "Foo" có thể đưa bạn đi xem "Bar", nhưng điều đó không thuận tiện, di chuyển tất cả những sinh vật đó (ví dụ) xung quanh. Tuy nhiên, "Foo" có thể gửi "Bar" số điện thoại của bạn (con trỏ). Bằng cách đó, bất kể bạn ở đâu, "Foo" biết cách liên lạc với bạn mà không phải tìm bạn.

Và, giả sử "Bar" có một người quen, "Baz", người cũng muốn liên lạc với bạn. Nhưng bạn bảo vệ số điện thoại của mình và bạn không muốn mọi người có, "Baz" có thể gọi "Bar" (điện thoại là con trỏ), người sau đó có thể chuyển tiếp cuộc gọi cho bạn (một con trỏ khác). Và cứ thế lặp đi lặp lại chuỗi bạn bè của "Baz" và bạn của bạn bè.


2

Pointers làm cách ý nghĩa hơn nếu bạn đã nghiên cứu ngôn ngữ lắp ráp và / hoặc kiến trúc máy tính. Tôi nghĩ rằng nếu tôi dạy một lớp C, tôi sẽ bắt đầu với một vài tuần kiến ​​trúc để giải thích mô hình bộ nhớ và các loại hướng dẫn mà bộ xử lý thực sự thực thi.


Chắc chắn rồi. Khi bạn xử lý các thanh ghi và hiểu những thứ như giá trị ngay lập tức và địa chỉ gián tiếp, toàn bộ khái niệm về con trỏ là trực quan. Tôi đã học lắp ráp 6502 và sau đó là 68K lắp ráp trước khi viết dòng C đầu tiên của mình, vì vậy, khi tôi được giới thiệu về con trỏ, tôi đã xem bộ lắp ráp (trung gian) và nó chính xác như mong đợi.
Radian

2

"Aha!" Của tôi thời điểm đến trong hướng dẫn này:

Hướng dẫn về Con trỏ và Mảng trong C

Nói chính xác, nó đã đến trong chương này: Chương 3: Con trỏ và Chuỗi

Nói chính xác hơn, nó đi kèm với câu này:

Tham số được truyền cho put () là một con trỏ, là giá trị của một con trỏ (vì tất cả các tham số trong C được truyền theo giá trị) và giá trị của một con trỏ là địa chỉ mà nó trỏ tới, hoặc, đơn giản là một địa chỉ .

Khi tôi đọc điều đó, những đám mây tách ra và những thiên thần thổi kèn.

Đối với, bạn thấy, mọi hướng dẫn hoặc cuốn sách C tôi đã đọc trước đó đã khẳng định rằng C có thể vượt qua giá trị hoặc bằng cách tham chiếu, một lời nói dối bất chính. Sự thật là C luôn vượt qua giá trị, nhưng đôi khi giá trị được chuyển xảy ra là một địa chỉ. Trong phương thức, một bản sao được tạo từ địa chỉ đó, giống như một bản sao sẽ được tạo từ một int được truyền vào. Một bản sao không được tạo từ giá trị mà con trỏ trỏ tới. Do đó, bằng cách sử dụng con trỏ trong phương thức, bạn có thể truy cập giá trị ban đầu và thay đổi nó.

Tôi chưa bao giờ trở thành lập trình viên C, nhưng tôi đã trở thành lập trình viên .NET và các đối tượng và tham chiếu đối tượng hoạt động theo cùng một cách; tham chiếu đến đối tượng được truyền theo giá trị (và do đó được sao chép), nhưng bản thân đối tượng không được sao chép. Tôi đã làm việc xung quanh nhiều lập trình viên, những người không hiểu điều này bởi vì họ không bao giờ học được con trỏ.


1

Bí quyết là giải thích rằng vị trí của một vật và bản thân vật đó không giống nhau, giống như hình ảnh của một đường ống không phải là một đường ống . Khi bạn di chuyển một vật, vị trí của nó thay đổi. Vị trí vẫn còn và một số điều khác có thể được đặt ở đó.


1

Một con trỏ là một ghi chú dán cho bạn biết nơi nào đó hữu ích. Nó chứa vị trí của sự vật và cho bạn biết nó lớn đến mức nào (bằng C, dù sao đi nữa). Vì vậy, một con trỏ đôi giống như một tờ giấy ghi chú "Có sáu gói trong tủ lạnh". Bạn phải thực sự đi lấy sáu gói để tìm hiểu xem đó là Coke hay Budweiser.


1

Cho mã:

int v=42; // khai báo và khởi tạo một biến đơn giản

int *p = &v; // tạo một điểm p cho biến v

Sau đây có thể nói về đoạn mã trên:

int * p // "int con trỏ p" ... đây là cách bạn khai báo một con trỏ tới biến kiểu int

*p // "được trỏ bởi p" ... đó là dữ liệu mà p trỏ tới, giống như v.

&v // "địa chỉ của biến v" ... điều này thể hiện giá trị bằng chữ cho p


1

http: // csl Library.stanford.edu/

Trang web này có các hướng dẫn tuyệt vời để học con trỏ và quản lý bộ nhớ.

Tôi sẽ đề nghị bạn đi qua những điều cơ bản về con trỏ, con trỏ và bộ nhớ được đưa ra trên trang web. Bạn cũng có thể xem xét các vấn đề danh sách được liên kết đưa ra trên liên kết để tăng cường hơn nữa các khái niệm con trỏ.


1

Chìa khóa để giải thích con trỏ là đảm bảo rằng những người bạn đang giải thích, đã có sự hiểu biết về khái niệm bộ nhớ. Mặc dù thật tuyệt nếu họ thực sự hiểu nó ở mức thấp, tin rằng bộ nhớ tồn tại dưới dạng một mảng lớn và hiểu rằng bạn có thể truy cập bất kỳ vị trí nào trong mảng bằng vị trí chỉ mục của nó là đủ.

Bước tiếp theo, có khái niệm chuyển vị trí chỉ mục thay vì sao chép toàn bộ bộ nhớ có ý nghĩa với hầu hết mọi người. Và điều đó là đủ để cho phép hầu hết mọi người hiểu tại sao con trỏ lại hữu ích.

Bước cuối cùng để hiểu con trỏ là giải thích làm thế nào bạn có thể truyền vào như một tham số một vị trí chỉ mục bộ nhớ cho phương thức để lưu trữ vị trí chỉ mục cho nơi lưu trữ tất cả dữ liệu. Tôi đã thấy rằng điều này có thể là quá xa đối với một số người để đối phó.

Khi ai đó đã nắm được các bước cơ bản này, họ sẽ hiểu rõ rằng bạn có thể xâu chuỗi con trỏ vô thời hạn, miễn là bạn theo dõi số lần bạn cần xem địa chỉ để tìm đối tượng dữ liệu thực tế.

Khi ai đó đã nắm được các con trỏ, điều tiếp theo mà họ phải nắm bắt nhanh chóng là sự khác biệt giữa bộ nhớ heap và bộ nhớ stack và tại sao các con trỏ để ngăn xếp bộ nhớ lại nguy hiểm khi được truyền ra ngoài phương thức.


0

Tôi nhớ một cuốn sách "Câu đố C" hoặc tương tự, mà tôi đọc hoàn toàn bởi vì đó là một trong số ít những cuốn sách liên quan đến lập trình / máy tính có sẵn trong thư viện, sự hiểu biết của tôi về C còn thô sơ. Nó ném một expresison C vào bạn, và yêu cầu khám phá nó, ngày càng phức tạp hơn.


0

Khi tôi ở trường đại học, giáo sư của tôi có một số slide powerpoint thực sự gọn gàng mô tả một điểm là một biến riêng biệt với một mũi tên đến một vị trí bộ nhớ (đại diện như một mảng) và khi chúng tôi đang thực hiện Danh sách liên kết, ông sẽ thực hiện bước đó -bước bước, hiển thị khi mũi tên thay đổi, khi con trỏ bị hủy đăng ký, v.v ..., không có cách nào người ta không thể hiểu nó trong vài phút. Bản thân khái niệm này thực sự dễ dàng, nhưng thực hiện đúng hoặc áp dụng nó trong các chương trình thực tế đòi hỏi phải thực hành nhiều hơn.


0

Trước khi tôi làm điều đó, tôi giải thích rằng trong lập trình "mọi thứ đều sử dụng bộ nhớ" và phân bổ biến (tĩnh) trong bộ nhớ. Tôi cũng sẽ giải thích địa chỉ bộ nhớ là gì và mối quan hệ giữa không gian bộ nhớ, địa chỉ bộ nhớ và các biến.

Cuối cùng, tôi giải thích rằng có các kiểu dữ liệu và biến số nguyên, kiểu dữ liệu chuỗi và biến ... và cứ thế, cho đến khi giải thích rằng có một kiểu dữ liệu đặc biệt lưu trữ địa chỉ bộ nhớ, có giá trị trống như 0 o "", gọi là null .

Và cuối cùng, các biến được phân bổ động thông qua việc sử dụng các con trỏ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.