Tại sao phải dùng con trỏ trong c++

mình đang tự học c++,tới bài con trỏ, mình cũng tìm hiểu trên mạng và video của anh đạt la ,con trỏ là mang giá trị của biến khác,trỏ vào biến, nhưng mình không hiểu là ta phải làm gì với địa chỉ mà ta đã lấy,

Thật ra là ta sử dụng nó để làm công việc của ta được dễ dàng hơn.
Ví dụ như bạn muốn sử dụng một kiểu dữ liệu mà chưa biết trước bộ nhớ mà ta sẽ cấp phát cho nó là bao nhiêu thì sẽ dùng con trỏ.

2 Likes

This post was flagged by the community and is temporarily hidden.

bạn có thể giải thích chỗ này không "bộ nhớ mà ta sẽ cấp phát cho nó là bao nhiêu " bạn

là sao bạn…bạn lấy ví dụ được không

Khi bạn muốn sử dụng một biến thì bạn phải cấp phát cho nó một bộ nhớ nhất định để có thể hoạt động.
Ví dụ như bạn tạo một mảng mà không cho biết số phần tử(tức là máy tính sẽ không biết cấp phát bao nhiêu ô nhớ) thì mảng đó không hợp lệ - sysnax error.
Để làm được điều đó thì ta dùng con trỏ để cấp phát động.
Ví dụ mảng kiểu int thì sẽ cấp phát 4 hoặc 8 byte tùy theo complier sử dụng.
Sau đó bạn có thể linh hoạt dùng nó.


Có lẽ, hầu hết những người mới tiếp xúc với con trỏ đều cảm thấy mơ hồ.
Hồi trước mình học cũng phái mất rất rất lâu mới có thể nắm được sơ sơ về con trỏ :confounded:

7 Likes

Con trỏ sao mà lưu giá trị biến khác ?

Con trỏ chỉ là một biến lưu giữ một địa chỉ vật lý (nằm trên RAM). Thông qua con trỏ ta có thể đọc / thay đổi giá trị của ô nhớ có địa chỉ mà con trỏ đang giữ.

Bạn khai báo biến kiểu thông thường thì biến đó nằm trong phạm vi chương trình. Bây giờ bạn muốn làm việc với biến ngoài phạm vi của chương trình thì con trỏ mới giúp bạn được. Đó mới là lúc bạn phải dùng con trỏ.

Muốn hiểu dễ dàng con trỏ bạn nên tìm hiểu trước cấu tạo máy tính. Bạn sẽ rất mơ hồ về con trỏ nếu không biết thanh RAM có cấu tạo như thế nào, không biết khi chạy một chương trình thì máy tính sẽ chạy nó như thế nào.

6 Likes

Bạn thử đọc cái này xem: http://diendan.congdongcviet.com/threads/t42977::tim-hieu-ban-chat-cua-con-tro-tu-co-ban-den-nang-cao.cpp

3 Likes

cảm ơn bạn nhiều nhé

cảm ơn bạn nhiều nhé,

??? đâu ra định nghĩa này vậy. Viết thử trên Visual Studio, gán cho con trỏ một địa chỉ vật lý rồi dereference nó coi có bị crash không. Hệ điều hành bây giờ làm gì cho phép con trỏ chứa được địa chỉ vật lý nữa.

Biến thông thường là biến như thế nào ?
Làm việc với biến ngoài phạm vi chương trình là thế nào, liên quan gì đến việc buộc phải dùng con trỏ.

Đã mất công trả lời thì tìm hiểu cho chính xác rồi hẵng trả lời, trả lời cho có rồi người không biết lại càng hiểu sai.

3 Likes

cảm on bạn nhé …

Physical address hay logical address phụ thuộc vào nền tảng.
Visual Studio chạy trên windows, windows không cho truy cập trực tiếp vào physical add mà thông qua các virtual address trong address page

Funfact: windows có thể tăng kích thước của virtual memory chứa virtual address, nhưng hơi bị thốn đóa :wink:

2 Likes
  1. Tự định nghĩa. và dù cái gì thì nó cũng đều chỉ tới địa chỉ vật lý. Nó chỉ đến địa chỉ ảo A rồi A lại trùng với địa chỉ vật lý B thôi.
    Tại sao lại liên quan con trỏ với hệ điều hành là sao ? Có biết bao nhiêu hệ điều hành đâu phải đều giống nhau. Có bao nhiêu thiết bị không có hệ điều hành mà người ta đang dùng con trỏ trong lập trình cho những con chip xử lý thì là như thế nào? Hệ điều hành nào quy định trong trường hợp này nữa ?
    (Ngay như cách đây 5 phút tôi vẫn phải dùng con trỏ khi lập trình để lấy dữ liệu trên RAM của một con chip mà tôi đang lập trình- Vậy thì liên quan gì đến hệ điều hành nào ở đây ?)

  2. Biến thông thường là những biến lưu giá trị (khác với lưu địa chỉ).

  3. làm việc với biến ngoài phạm vi chương trình là làm với những cái tôi ví dụ:

  • Hack game : Phải dùng con trỏ trỏ tới địa chỉ của biến điểm trong game để thay đổi điểm của game.
  • Close chương trình khác : Phải dựa vào con trỏ (chính là Handle của chương trình khác) rồi gửi MESSAGE.
  • Lấy TEXT trên 1 Label của chương trình khác : Không có con trỏ (Handle của Label ) thì sẽ lấy như thế nào ???
5 Likes

đâu phải địa chỉ ảo bất kì nào cũng trỏ tới địa chỉ thật đâu: http://stackoverflow.com/questions/33767623/does-a-virtual-address-always-translate-to-a-physical-one

mỗi chương trình (ví dụ 32-bit) đều có 4GB địa chỉ ảo. Tại 1 thời điểm cả chục chương trình chạy cùng lúc. Nếu tất cả địa chỉ ảo nào đều map tới địa chỉ thật thì địa chỉ thật đâu ra cho đủ? Xài chung à? Làm gì có. Nếu xài chung thì cần gì địa chỉ ảo nữa, xài luôn địa chỉ thật cho rồi.

5 Likes

Không trỏ tới địa chỉ thật thì là cái mà người ta hết sức tránh để không xảy ra. Vì khi đó mà thao tác sẽ gặp lỗi.

Địa chỉ thật thì sẽ không xài chung mà mỗi thằng chia nhau xài một ít. Thằng nào cần nhiều thì OS cấp cho nhiều. Hết địa chỉ thì cả hệ thống nghỉ.

3 Likes

@Duong_Act Cuốn này cho người mới nhập môn Embedded

Kiếm đọc rồi bớt phát biểu tào lao dùm cái. Nhớ trong đó có mục Locating với Memory Map đó. Cả cuốn sách chỉ yêu cầu người đọc viết nổi một chương trình chớp tắt LED thôi, không phải to tát đâu, nhưng là viết và hiểu thực sự từ cái lông chân của nó chứ không phải lấy cái IDE Compiler của hãng, biên dịch xong, kiếm mạch nạp đổ xuống cho nó chạy.

Còn về câu hỏi của @nhox_namby1, tại sao em thấy có người dùng con trỏ trong C++ thì là vì người đó là một người code C++ mù mờ hoặc là chuyển từ C qua nên họ chọn pointer thay vì reference, vậy thôi. Còn em chưa học đến bài reference thì đọc bài đó trước đi rồi từ nay khỏi cần dùng pointer nữa, em cũng sẽ không có nhu cầu đâu.

6 Likes

hết địa chỉ trên ram thì OS cho xuống địa chỉ trên hard disk. Nhưng truy cập địa chỉ ảo mà chưa gắn với địa chỉ thật thì sẽ báo lỗi, thường là seg fault hay gì đó. Bởi vậy trong C/C++ khi tạo con trỏ thường nên gán NULL cho nó:
int* ptr = NULL;
để lỡ có *ptr thì chương trình cũng báo lỗi hợp lý. Chứ ko gán gì cho ptr thì ptr có giá trị rác, nếu *ptr thì sẽ báo lỗi ngay. Đây là truy cập địa chỉ ảo bất kì nè. Lỗi liền vì có địa chỉ thật nào gắn với địa chỉ ảo rác đâu.

bản thân mình cũng ko học kỹ phần computer architecture / OS lắm, nhưng OS nào cũng phải có 1 cái page table, map địa chỉ ảo với địa chỉ thật. Nếu địa chỉ ảo ko có trong page table này thì báo lỗi liền.

với lại 1 địa chỉ ảo ko phải lúc nào cũng cố định gắn với 1 địa chỉ thật, mà có thể thay đổi. Ví dụ 1 con trỏ trong Chrome 0x100 gắn với 0x123 trên RAM, sau đó bật thêm game XYZ lên ngốn 4GB ram, hết chỗ chứa trong RAM, OS phải chuyển tất cả những gì của Chrome xuống hard disk tạm. Sau đó Chrome muốn truy cập địa chỉ ảo 0x100 thì sẽ gây ra page fault, OS phải lôi dữ liệu từ hard disk lên ram lại, cung cấp địa chỉ mới, vd 0x234. Chrome chỉ biết là biến x có địa chỉ 0x100 chứ ko cần biết là 0x123 hay 0x234. Cái đó OS lo.

4 Likes

Thôi nhé !
Chớp tắt led chỉ là bài giống như “Hello World” vậy.
Khi ai đó viết chương trình ở mức rất thấp ( chơi trưc tiếp với CPU) thì không biết con trỏ nó không trỏ tới địa chỉ vật lý thì không biết nó trỏ tới cái gì nữa.

2 Likes

@tntxtnt

Bạn đang nói đến trường hợp một chiếc máy tính và C++ trên máy tính đó.
Còn những chỗ khác không phải chiếc máy tính, không có OS, không có Harddisk nhưng người ta vẫn code chương trình chạy trên nó bằng C++ và vẫn có pointer.

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?