logo

Thông báo

Icon
Error

Thắc mắc về tham trị và tham chiếu
trieudong0485
#1 Đã gửi : 12/11/2012 lúc 09:07:19(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 27-02-2012(UTC)
Bài viết: 5

Cảm ơn: 12 lần
Được cảm ơn: 3 lần trong 3 bài viết

Có thành viên IT nào yêu thích lập trình cho mình hỏi sự khác nhau giữa tham trị và tham chiếu được không? Mình học tới chỗ này tự nhiên hết hiểu luôn. Tại vì mình dùng cách nào thì khi chạy chương trình nó cũng ra kết quả đúng hết ak!!

Bài giảng mình được học:
Thamtrị: Một tham số được truyền theo dạng tham trị thì giá trị sẽ không bị thay đổi khi kết thúc phương thức
Ví dụ:
class CPoint
{
  int xVal, yVal;
  public:
    CPoint(int, int)
    {
       xVal = x;
       yVal = y;
    }

    void InputPoint(CPoint p)
    ~CPoint(){}
};

void CPoint::InputPoint(CPoint p)
{
  cout<<"Nhap x"; cin>>p.xVal;
  cout<<"Nhap y"; cin>>p.yVal;
}

void main()
{
  CPoint p1,p2;
  p1.InputPoint(p2);
}

Tham chiếu:Một tham số được truyền theo dạng tham chiếu thì giá trị sẽ bị thay đổi khi kết thúc phương thức

Ví dụ:
class CPoint
{
  int xVal, yVal;
  public:
    CPoint(int, int)
    {
       xVal = x;
       yVal = y;
    }

    void InputPoint(CPoint &p)
    ~CPoint(){}
};

void CPoint::InputPoint(CPoint &p)
{
    cout<<"Nhap x"; cin>>p.xVal;
    cout<<"Nhap y"; cin>>p.yVal;
}

void main()
{
    CPoint p1,p2;
    p1.InputPoint(p2);
}

Lý thuyết là vậy nhưng mình vẫn không hiểu rõ lắm, có đọc thêm tài liệu chỗ này chỗ kia cũng thế, chẳng biết lúc nào dùng cái nào thì tối ưu chương trình hơn cả  . Rất mong những ai quan tâm giải đáp giúp. Mình rất rất rất rất cảm ơn!!!

1 người cảm ơn trieudong0485 cho bài viết.
sababie trên 20-11-2012(UTC) ngày
skyblue
#2 Đã gửi : 20/11/2012 lúc 03:26:55(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 20-11-2012(UTC)
Bài viết: 1

Được cảm ơn: 3 lần trong 1 bài viết

Chào em,


Em đã hiểu được sự khác nhau giữa tham chiếu và tham trị trong chương trình. Ở đây trao đổi với em về sử dụng tham chiếu.


Ví dụ cho đoạn chương trình sau:


...{


int m;


int &n=m; 


m=25;  //  (1)


cout<<m;


cout<<n;


n+=10;


cout<<m;


cout<<n;


}


Khi thực hiện chương trình xuất hiện kết quả như sau


m=25   


n=25


(1) gán giá trị 25 cho biến m cũng có nghĩa gán giá trị 25 cho biến n


sau khi cộng 10 vào n, cũng có nghĩa biến m tăng thêm 10


m=35


n=35


Vì vậy khi khai báo biến n tham chiếu đến biến m thì những thay đổi giá trị của biến m cũng thay đổi giá trị của biến n và ngược lại. Khi khai báo biến tham chiếu như n thì biến n không được cấp phát bộ nhớ, không có địa chỉ và dùng chung vùng nhớ với biến m.


Tương tự cho chương trình của em cũng vậy, em có thể thêm một vài dòng lệnh khi cho xVal, yVal thay đổi giá trị cho hai đoạn chương trình trên.


Chúc em học tốt. 

3 người cảm ơn skyblue cho bài viết.
sababie trên 20-11-2012(UTC) ngày, trieudong0485 trên 24-11-2012(UTC) ngày, Rainie trên 25-11-2012(UTC) ngày
emkhongbietgidau
#3 Đã gửi : 20/11/2012 lúc 04:24:38(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên

Cảm ơn: 2 lần
Được cảm ơn: 14 lần trong 10 bài viết
Bài viết được xoá bởi người gửi.
2 người cảm ơn emkhongbietgidau cho bài viết.
sababie trên 20-11-2012(UTC) ngày, trieudong0485 trên 24-11-2012(UTC) ngày
sababie
#4 Đã gửi : 20/11/2012 lúc 11:56:48(UTC)
sababie

Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 01-11-2012(UTC)
Bài viết: 17
Man
Đến từ: Khoa CNTT

Thanks: 42 times
Được cảm ơn: 3 lần trong 2 bài viết

...** A ha! Chị Tiên tốt nghiệp rồi mà vẫn sôi nổi ở Diễn đàn trường mình ghê ta!!


Chị ơi em đang trên đường theo hướng Lập trình như chị đây, chị giúp đỡ em với nha!!!


 

_Dục Tốc Bất Đạt_
2 người cảm ơn sababie cho bài viết.
trieudong0485 trên 24-11-2012(UTC) ngày, Rainie trên 25-11-2012(UTC) ngày
trieudong0485
#5 Đã gửi : 24/11/2012 lúc 09:14:38(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 27-02-2012(UTC)
Bài viết: 5

Cảm ơn: 12 lần
Được cảm ơn: 3 lần trong 3 bài viết

Xin cảm ơn Skyblue và Emkhong bietgidau đã giúp em giải đáp được thắc mắc. Có lẽ vấn đề của em ở đây là chưa phân biệt được đâu là địa chỉ và đâu là giá trị. Giờ thì em thông rồi. Một lần nữa cảm ơn rất nhiều.


Về sababe, lập trình là hướng đi của mình mà. Mình đã chọn nó và đang làm mọi cách để nó chấp nhận mình. Vậy thôi!. Chúc bạn học tốt.!!! Ah, khi bạn cần giúp đỡ, cứ liên hệ với mình. chỉ cần trong khả năng mình sẽ không từ chối đâu. 

1 người cảm ơn trieudong0485 cho bài viết.
emkhongbietgidau trên 24-11-2012(UTC) ngày
emkhongbietgidau
#6 Đã gửi : 24/11/2012 lúc 10:36:43(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên

Cảm ơn: 2 lần
Được cảm ơn: 14 lần trong 10 bài viết

trieudong0485;385 đã viết:


Xin cảm ơn Skyblue và Emkhong bietgidau đã giúp em giải đáp được thắc mắc. Có lẽ vấn đề của em ở đây là chưa phân biệt được đâu là địa chỉ và đâu là giá trị. Giờ thì em thông rồi. Một lần nữa cảm ơn rất nhiều.


Về sababe, lập trình là hướng đi của mình mà. Mình đã chọn nó và đang làm mọi cách để nó chấp nhận mình. Vậy thôi!. Chúc bạn học tốt.!!! Ah, khi bạn cần giúp đỡ, cứ liên hệ với mình. chỉ cần trong khả năng mình sẽ không từ chối đâu. 



Chúc bạn thành công trên con đường mình đã chọn. Mình cũng biết chút chút về lập trình, hy vọng mình cũng có những chút kinh nghiệm chia sẻ cùng bạn và học hỏi từ bạn và mọi người.


Thanks,

[img]http://fc03.deviantart.net/fs10/f/2006/127/5/e/Dragon.swf[/img]
2 người cảm ơn emkhongbietgidau cho bài viết.
Rainie trên 25-11-2012(UTC) ngày, trieudong0485 trên 27-11-2012(UTC) ngày
hoangbaongan
#7 Đã gửi : 25/11/2012 lúc 10:50:45(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 26-09-2012(UTC)
Bài viết: 1
Đến từ: viet nam

Được cảm ơn: 3 lần trong 3 bài viết

Mình ko phải là dân IT, cơ bản ở đây bạn bị vướng ở thuật ngữ chuyên môn (tham chiếu và tham trị) về thuật ngữ tham chiếu cũng thường dùng trong Excel cũng như các ngành kỹ thuật, mình sẽ cố gắn tìm ví dụ đơn giảng để minh họa cho thuật ngữ Tham chiếu để bất cứ ai cũng có thể hiểu vấn đề bạn đang gặp phải!

1 người cảm ơn hoangbaongan cho bài viết.
trieudong0485 trên 27-11-2012(UTC) ngày
trieudong0485
#8 Đã gửi : 27/11/2012 lúc 01:39:29(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 27-02-2012(UTC)
Bài viết: 5

Cảm ơn: 12 lần
Được cảm ơn: 3 lần trong 3 bài viết

Sau khi tạm gọi là tạm hiểu được vấn đề hóc búa này, mình có 2 ví dụ sau để phân biệt. Không biết có đúng hay không. Đúng thì xem như để các bạn có chung thắc mắc với mình có thể tham khảo còn như chưa đúng chỗ nào thì mong mọi người chia sẻ và góp ý thêm cho mình nha! (Mình viết bằng C++)


vd1: Tham trị
void Kiemtra(int x)
{
  x=x+10;
}

void main()
{
  int n=5;
  Kiemtra(n);
  cout<<"Gia tri n= "<<n;
}

Kết quả sau khi thực hiện chương trình trên: Gia tri n = 5. Ở đây n vẫn giữ nguyên giá trị ban đầu mặc dù trong hàm Kiemtra có câu lệnh nhằm làm thay đổi nó. Vì khi truyền bằng tham trị, hàm Kiemtra sẽ tạo ra 1 bản copy (tạm gọi là x1) của biến tham số x và thao tác trên nó trong suốt quá trình xử lý. Nên sau khi hàm kết thúc, giá trị biến x vẫn không thay đổi.

vd2: Tham chiếu
void Kiemtra(int &x

  x=x+10;
}

void main() 

  int n=5;
  Kiemtra(n); 
  cout<<"Gia tri n= "<<n;

Kết quả sau khi thực hiện chương trình trên: Gia tri n = 15. Ở đây n đã bị thay đổi giá trị. Nguyên nhân: khi truyền bằng tham chiếu, tham số x truyền vào không có vùng nhớ riêng và vùng nhớ đó sẽ được cấp phát bên ngoài hàm (cụ thể là trong main). Nói đúng hơn là biến tham số x trong hàm Kiemtra và biến n trong main cùng có chung 1 vùng nhớ. Vì thế mọi thao tác trong hàm lên biến x đều ảnh hưởng đến giá trị biến n.

Tóm lại:
- Khi truyền tham số theo kiểu tham trị thì giá trị của biến sẽ được copy vào biến cục bộ của hàm và tương tác trên đó. Bản thân biến toàn cục (được khai báo ngoài hàm, được truy xuất trong lời gọi hàm) sẽ không bị liên quan đến mọi sự thay đổi diễn ra trong hàm.
- Khi truyền theo kiểu tham chiếu, biến khai báo trong hàm sẽ trở thành một tham chiếu của biến toàn cục. Tức là nó giữ chung ô nhớ với biến toàn cục, vì thế mọi thao tác với nó đều ảnh hưởng đến giá trị của biến toàn cục.

Đúng hông ta????

yeonbeo0503
#9 Đã gửi : 06/03/2014 lúc 04:53:07(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 04-03-2014(UTC)
Bài viết: 3

Thanks, topic mình đang cần !

---------------------------------------

Trung tâm dạy hoc lai xe b2 mở các khóa day lai xe b2 tại truong day lai xe b2 tại Hà Nội cấp bang lai xe b2 bởi các giảng viên day lai xe b2 kinh nghiệm.
jackkieu
#10 Đã gửi : 21/12/2014 lúc 11:39:08(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 21-12-2014(UTC)
Bài viết: 3

Cảm ơn: 1 lần

Cảm ơn đúng topic em đang cần ^^

jackkieu
#11 Đã gửi : 21/12/2014 lúc 11:45:27(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 21-12-2014(UTC)
Bài viết: 3

Cảm ơn: 1 lần

Thank nha đúng topic những điều em cần ^^

hyundaivinhphuc
#12 Đã gửi : 29/11/2016 lúc 11:01:57(UTC)
Danh hiệu: Thành viên

Nhóm: Thành viên
Gia nhập: 29-11-2016(UTC)
Bài viết: 1
Đến từ: Hyundai 3s Vĩnh Phúc


Cảm ơn mọi người!

Ai đang xem chủ đề này?
Guest (3)
Di chuyển  
Bạn không thể tạo chủ đề mới trong diễn đàn này.
Bạn không thể trả lời chủ đề trong diễn đàn này.
Bạn không thể xóa bài của bạn trong diễn đàn này.
Bạn không thể sửa bài của bạn trong diễn đàn này.
Bạn không thể tạo bình chọn trong diễn đàn này.
Bạn không thể bỏ phiếu bình chọn trong diễn đàn này.