Thật sự thì con trỏ dùng làm gì?

java thì Double hay Int là con trỏ, còn int là một int bình thường. Hay
HocSinh hs = new HocSinh();

ô thế nếu muốn truyền a vào phương thức nào đó để thay đổi nó và k cần return thì làm sao ?

Con trỏ truyền vào hàm ý bạn là truyền như thế nào và nó làm thay đổi dữ lieu của cái gì ??
Cho mình xin đoạn code demo.

Trong C, có đúng 3 lý do để bạn sử dụng 1 pointer :

  1. Reference: nhiều pointer trỏ đến cùng 1 chỗ (giúp ko duplicate code).
  2. Generic: pointer của bạn có thể trỏ đến nhiều vùng khác nhau (vd như trong 1 bài toán có lúc bạn cần hàm sin, có lúc bạn cần hàm cos hay tan, thì sử dụng pointer là tiện nhất…).
  3. Dynamic allocation : cái này dĩ nhiên bạn phải biết tại sao !!!

Nếu bạn ko hiểu trong từng trường hợp nào thì mình có thể nêu vd cho bạn.

3 Likes

sao lại không liên quan hả bạn? trong khi đang chạy chương trình mà bạn muốn cấp phát bộ nhớ động thì bạn lấy gì trỏ vào vùng mới cấp phát đấy nếu không phải là con trỏ?

mình tưởng Double và Interger trong java là class chứ nhỉ?

Java có con trỏ ạ? Mình ko dùng Java, kiến thức hạn hẹp, được mở rộng tầm mắt rồi

^ Cái này mình không biết có nên gọi là con trỏ không

Chắc ý bạn là Pass by reference
Cái này không có con trỏ vẫn làm được nhé, chỉ là hơi xấu (có dùng return).

Về ngôn ngữ của nó thì gọi là một object ( Đối tượng của một class ). nhưng khi nhìn về lại c++ thì nó cũng như một con trỏ thôi.

#include <iostream>
#include <string>

using namespace std;
class HocSinh{
    public:
        char mTen ;
    public:
        // .....................................................................
        HocSinh(char ten){
            mTen = ten;
        }
};


void capNhatThongTin(HocSinh *);
int main() {
    // your code goes here
    int a= 10;
    int *mPoints = &a;
    HocSinh *hocSinh = new HocSinh('T');
    
    std::cout << "Ten : " << hocSinh->mTen << std::endl; // Ten = T
    
    capNhatThongTin(hocSinh);
    std::cout << "-------------CAP NHAT THONG TIN------------" << std::endl;
    std::cout << "Ten : " << hocSinh->mTen << std::endl; // Ten = C
    std::cout << ' ' << std::endl;
    
    return 0;
}
void capNhatThongTin(HocSinh *hocSinhPointer){
    hocSinhPointer->mTen = 'C';
}

Cho hẳn ví dụ này luôn. Tại sao hocSinPointer thay đổi mà lên main lấy hocSinh xuat tên ra lại cũng là C. nó thay đổi ở đâu ? thay đổi như thế nào ?

HócinhPointer đang chỉ tới hocsinh và hàm CapNhatThongTin thay đổi mTen của Hocsinhpointer thì đương nhiên hocsinh->mTen thay đổi.

1 Like

tại sao nó thay đổi ? nó thay đổi ở đâu ? thay đổi như thế nào ?

// lưu ý: nếu nói HocSinhPointer chỉ tới hocSinh là sai nhé.

Nó chỉ tới vùng dữ liệu của hocsinh.
Do vậy thay đổi mTen của nó thì sẽ thay đổi mTen của hocsinh.

2 Likes

Nói đúng hơn thì hocSinh và hocSinhPointer cùng trỏ đến cùng một địa chỉ dữ liệu. nên một trong 2 thằng thay đổi thì thằng kia thay đổi theo á. không biết Bạn có nghiên cứu stack và heap chưa, nếu chưa thì đọc thử đi hay á.

Để kiểm tra Bạn có thể test bằng cách thay vì là con trỏ thuộc class HocSinh Bạn tạo ra một kiểu int xong gắn con trỏ cho nó. và phương thức cũng như thế. Bạn viết thử địa chỉ và gía triij cho từng thằng mmột Bạn sẽ thấy rõ hơn. hocSinhPointer làm thay đổi dữ liệu của thằng a.

Mình có tìm hiểu stack và heap rồi nhưng không sâu lắm. Cả stack của phần cứng nữa. Nhưng quả thật chưa bao giờ đụng tới tầng thấp vậy.

2 Likes

hihi mình cũng mới tìm hiểu cũng hiểu được sơ sơ à. nói chung nó cần nhưng không phải là cần thiết :stuck_out_tongue: . hihi hay ghê trao đổi vậy học được nhiều nè :blush:

Khi con trỏ trỏ tới vùng nhớ nào đó thì khi ta làm việc với con trỏ là đang làm việc với vùng nhớ mà nó đang chỉ tới.

2 Likes

uhm. như vậy mình có thể gọi nó là bản sao của thằng được trỏ tới không ta. còn tham chiếu thì là Bản sao chắc chắn rồi.

Không. Không thể coi là bản sao được bởi vì con trỏ nó không giống với cái thực thể mà nó chỉ tới. Vì nó không giống nhau đâu.

2 Likes

ah cam on ban, cai vu ban sao lam minh phan van

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