Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Con trỏ và tham chiếu trong C++, công dụng và cách dùng

  1. #1
    Ngày gia nhập
    10 2007
    Bài viết
    31

    Cool Con trỏ và tham chiếu trong C++, công dụng và cách dùng

    Đệ mới học C++, đệ có một thắc mắc nho nhỏ là: đệ đọc đi đọc lại mấy cái con trỏ và tham chiếu mãi không hiểu dc cách dùng của bọn nó. nếu dùng cho các biến đơn thì đệ hiểu rồi. Nhưng khi gán giá trị trả về của hàm là con trỏ hay tham chiếu thì đệ không được rõ cho lắm. Thường thì đệ không hiểu được bản chất của việc để giá trị trả về của hàm là tham chiếu (con trỏ)! Tại sao phải để giá trị trả về là như vậy? Đệ dùng giá trị trả về ko là con trỏ (tham chiếu) có thấy sao đâu! mà nó lại đỡ phức tạp!! Mà đệ cũng chả biết khi nào thì cần để giá trị trả về của hàm là tham chiếu (con trỏ) !
    Ai có thể giúp đệ với, giải thích giùm đệ với! Đệ xin hậu tạ
    MORE.........................

  2. #2
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Con trỏ trỏ tới A, sau đó trỏ sang B vẫn ok.
    Tham chiếu tới A, tham chiếu sang B -> không có chuyện đó.
    Khác nhau nữa là con trỏ có thể cấp phát động dùng lúc run-time.
    Giống nhau : cả 2 đều sữa đổi đc giá trị mà nó tham chiếu hay trỏ tới. Đây là những điều cơ bản giữa con trỏ và tham chiếu.
    Tham chiếu tới con trỏ, không có chuyện con trỏ tới tham chiếu nghe cậu.
    Học về Class và đối tượng chưa ? Cấu trúc dữ liệu ? Học tới mấy cái này thì sẽ hiểu nhiều hơn.

  3. #3
    Ngày gia nhập
    10 2007
    Bài viết
    31

    Éc! Bác không hiểu ý của em rồi! Em định hỏi về giá trị trả về của các hàm là con trỏ và tham chiếu cơ!Chứ không hỏi về sự khác nhau giữa pointer vs reference! .

    vd:
    C++ Code:
    1. class String
    2. {
    3.    char* str; <----- tại sao lại phải để là  con trỏ, sao ko để là biến bt?
    4.    public:
    5.         ...
    6.         String& operator= (const String& s) <----- tại sao lại phải để giá trị trả về là tham chiếu?
    7.            {
    8.                      delete *str;
    9.                      str=strdup(s.str);
    10.                      return *this  <---- tại sao lại phải return *this? em tưởng câu lệnh str=strdup(s.str) là đã làm thay đổ nội dung của đối tượng hiện thời rồi chứ ???
    11.              }

    HÌ! đó là một số vd nho nhỏ mà em ko hiểu! Mong các bác chỉ giáo

    Vui lòng để code vào tag code. Đọc Nội quy để biết thêm chi tiết
    Đã được chỉnh sửa lần cuối bởi Kevin Hoang : 12-03-2008 lúc 01:34 PM. Lý do: Nhắc nhở tag code
    MORE.........................

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    char* str;
    Để cấp phát động, lúc runtime, size sẽ flexible, không cấp phát động thì làm sao dịch lúc run-time được. Nói rõ hơn ví dụ, tui khai báo :
    char arrD[100]; -> nếu chuỗi khoảng size = 50, dư 50 để làm gì ?
    char *arrD; -> cần bao nhiêu cấp phát bấy nhiều ví dụ cần 50 :
    arrD = new char[50];
    this là con trỏ tới đối tượng vậy suy ra -> *this = khử tham chiếu = đối tượng đó, quá tải toán tử gán trả về tham chiếu -> tham chiếu đến đối tượng đó. Tại sao trả về tham chiếu thì chỗ này để cascading*:
    *cascading ví dụ : a = b = c.
    Nếu cậu có đối tượng String a; String b; String c;
    Nếu trả về đối tượng thì không xài cái technique đó được, để hiểu rõ tui sẽ nêu từng bước cho cậu thấy :
    Bây h ví dụ :
    C++ Code:
    1.  
    2.   MyClass a; //Tạo 1 đối tượng a
    3.   MyClass& b = a; //b là 1 tham chiếu tới đối tượng a, hiểu thoáng ra là 1 cái tên khác để xử lý trên a.
    4.   a.setValues(10); //Chỗ này tui xử lý thằng a, cho nó bằng 10.
    5.   b.setValues(10);  //Chỗ này thằng b là 1 tên khác của a, vậy dòng này với dòng trên là 1 .
    6.  
    7.   b = a.setValues(7); //Bây h dòng này, a được trả về tham chiếu tới chính nó và gán cho b, mà b đã là tham chiếu tới a vậy dòng này chẳng có tác dụng gì, lãng phí ( cái ở trên ta bàn nhưng ở 1 khía cạnh hàm cho dễ hiểu trước rùi tui nói đến toán tử gán.
    8. Vậy a trả về tham chiếu
    9.   b.setValues(12); //Dòng này vì b là tham chiếu tới a, cho nên nó sẽ làm giá trị của a thay đổi
    Vậy thay vì ghi 2 dòng :
    C++ Code:
    1. b = a.setValues(7);
    2. b.setValues(12);
    Tui ghi 1 dòng cho tiện
    C++ Code:
    1. a.setValues(7).setValues(12);
    Bây h toán tử đc định nghĩa lại tức là ví dụ :
    C++ Code:
    1. String a;
    2. String b;
    3. a = b; //tức là tương đương với lời gọi hàm a.operator=(b);
    Mà như tuy ám chỉ ở trên là dùng cho kĩ thuật cascading a = b = c;
    Vậy trả về tham chiếu là hoàn toàn hợp lý.
    Code:
    a.operator=(b).operator=(c);
    Trả về tham chiếu tương đương với 1 tham chiếu tới đối tượng đó, vì chỉ có tham chiếu + con trỏ là thay đổi giá trị được của đối tượng, nếu không trả về tham chiếu thì hoặc là trả về con trỏ, chỉ vậy thôi .

  5. #5
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Chính sự rắc rối đó mà dotNET ra đời để ko cần quan tâm mày là con trỏ hay là tham chiếu, tao cứ dot hết là xong.

  6. #6
    Ngày gia nhập
    10 2007
    Bài viết
    31

    Mặc định Con trỏ và tham chiếu trong C++, công dụng và cách dùng

    Trích dẫn Nguyên bản được gửi bởi huynguyen Xem bài viết
    Chính sự rắc rối đó mà dotNET ra đời để ko cần quan tâm mày là con trỏ hay là tham chiếu, tao cứ dot hết là xong.
    vẫn biết là như thế nhưng em đang phải làm bt hướng đối tượng ở lớp, đề tài là dùng C++ để viết 1 chương trình tính toán số học với các số nguyên lớn, các số nguyên bắt buộc phải dùng linked list. Hic! đệ giờ đang phải học C++ mà thấy mấy cái return tham chiếu (pointer) khó hiểu quá!! Ai có thể giúp mình hiểu bản chất của việc khi nào thì cần để giá trị trả về là tham chiếu (con trỏ) không ????

    Trả về tham chiếu tương đương với 1 tham chiếu tới đối tượng đó, vì chỉ có tham chiếu + con trỏ là thay đổi giá trị được của đối tượng, nếu không trả về tham chiếu thì hoặc là trả về con trỏ, chỉ vậy thôi .
    đệ cảm ơn huynh nhiều nhưng đệ vẫn chưa hiểu lắm. cái đệ không hiểu là cái return của function cơ hix! hay là não em nó ngắn
    MORE.........................

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Stop crying ! That's annoying ! Ví dụ nào không hiểu post lên đây ? Tui đã ghi ra hết rùi, đọc thì không đọc mà cứ khóc.
    return tham chiếu (pointer) khó hiểu quá!!
    Trả về giá trị thì làm sao nó tiếp tục thay đổi được cái khác ? Trả về tham trị chỉ là 1 giá trị thôi ( so it's done ).
    - Trả về tham chiếu hay con trỏ đều như nhau -> để làm gì ? -> để từ đối tượng gọi hàm đó nó còn có thể thay đổi của những thằng khác nữa.

  8. #8
    Ngày gia nhập
    10 2007
    Bài viết
    31

    hì! dạ đệ hiểu rồi! thank you! mecsi!

    //ps: you are big help
    Đã được chỉnh sửa lần cuối bởi punkrock : 16-03-2008 lúc 06:23 PM.
    MORE.........................

  9. #9
    Ngày gia nhập
    03 2008
    Bài viết
    5

    Sẵn tiện hỏi ké luôn:

    Giã sử có đoạn code như sau:
    C++ Code:
    1. int N;
    2. double* u, *v;

    Địa chỉ của biến bình thường thì mình biết rồi.
    (1) - Hình đính kèm
    - Còn địa chỉ của con trỏ sau nó có thêm "IIIIIIIIII" ở phía sau nữa.
    - Mà tại sau u,v khai báo giống nhau mà độ dài của u lại ngắn hơn v.

    (2) - Hình đính kèm
    -52 'I' là cái gì vậy.

    Thank
    Attached Thumbnails Attached Thumbnails Debug_w.jpg  
    Đã được chỉnh sửa lần cuối bởi 64bit : 20-04-2009 lúc 11:54 AM.

  10. #10
    Ngày gia nhập
    03 2008
    Bài viết
    5

    Ủa sao không ai trả lời vậy, ta anh R2 ơi trả lời đi

Các đề tài tương tự

  1. Dùng Kiểu tham chiếu trong hàm ủy quyền ??
    Gửi bởi tldh.89 trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 1
    Bài viết cuối: 01-01-2014, 01:04 PM
  2. Bài tập C Bài tập tính lãi ngân hàng dùng đệ quy hoặc tham chiếu, tham trị
    Gửi bởi thaohoangf trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 08-10-2012, 08:24 AM
  3. Tại sao dùng const trong trường hợp dùng biến tham chiếu
    Gửi bởi dinhdoong trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 13
    Bài viết cuối: 04-02-2012, 10:45 PM
  4. Khi truyền tham chiếu nên dùng con trỏ hay lấy địa chỉ?
    Gửi bởi DucMjnh1992 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 9
    Bài viết cuối: 19-10-2010, 10:52 AM
  5. Dùng biến tham chiếu trong khai báo hàm ở ngôn ngữ C#?
    Gửi bởi egr trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 19-05-2010, 11:09 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn