Sự khác nhau giữa tham chiếu kiểu con trỏ và con trỏ?

Mọi người cho e hỏi sự khác nhau giữa tham chiếu kiểu con trỏ và con trỏ với ạ , e có 2 đoạn code

vd int k(int* &a) và int k(int *a)

theo e hiểu thì có phải cả 2 cái đều nhận vào là 1 địa chỉ của vùng nhớ phải không ạ ,mà nếu đã truyền thẳng địa chỉ rồi thì cần gì tham chiếu nhỉ ??

3 Likes

Tham số của hàm thứ nhất là tham chiếu con trỏ. Khi đối số được truyền vào là con trỏ thì nó dùng chính con trỏ đó để thao tác.
Tham số của hàm thứ hai là con trỏ. Khi đối số được truyền vào là con trỏ thì nó dùng bản sao trên vùng nhớ stack của con trỏ đó.
Tham chiếu hiểu như là bí danh nickname ấy :smile:

1 Like

Truyền tham chiếu kiểu con trỏ nếu bạn muốn thay đổi chính con trỏ ( tức là thay đổi địa chỉ con trỏ trỏ tới) hơn là đối tượng con trỏ đang trỏ tới. Hơi khó hiểu 1 chút nhưng lý do là vầy:
int k(int *a): Cái này là truyền con trỏ vào nhưng không thể nào thay đổi được địa chỉ con trỏ trỏ tới, chỉ có thể được nội dung của đối tượng con trỏ đang trỏ tới. Bởi vì pointer vẫn được truyền theo dạng truyền giá trị, tức là khi vào hàm sẽ tạo ra 1 bản sao của pointer trong stack, và bản sao này dù bạn có thay đổi nhưng thoát khỏi hàm thì giá trị cũng như ban đầu.

5 Likes

Thanks các bác , e đã đc thông não r :blush:

#include <iostream>

using namespace std;

void inmang(int* &a, int* &b){
    int tam = *a;
    *a = *b;
    *b = tam;
}
int main()
{
    int a = 10;
    int b = 20;
    int *p = &a;
    int *q = &b;
    swap(p,q);
    printf("%d %d", p, q);
    return 0;
}

may quá thông não dc tí rồi
Dạ nếu theo kiểu tham chiếu con trỏ thì code này con trỏ p sẽ nhận địa chỉ và gt của biến b còn 2 biến a, b vẫn giữ nguyên giá trị đúng không ạ, em chạy thấy in ra a vẫn vậy nhưng in ra p thì nó đã đc thay đổi

Bạn gọi hàm std::swap mặc định rồi còn đâu :smiley:

Hàm bạn viết sẽ tráo đổi a, b cho nhau.

2 Likes

à ok rồi e cảm ơn bác ạ, quên mất chưa sửa

à bác ơi cho em hỏi cái là giả sử như kiểu bài ở trên thì khi truyền đối số là con trỏ như trên vào hàm để thực hiện các công việc như so sánh, thay đổi giá trị, sắp xếp,… thì tham số ở hàm truyền vào vẫn khai báo con trỏ ạ

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