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ố 12 kết quả

Đề tài: Lấy địa chỉ của một tham chiếu trong gnu c++ ???

  1. #1
    Ngày gia nhập
    09 2006
    Bài viết
    18

    Mặc định Lấy địa chỉ của một tham chiếu trong gnu c++ ???

    Mọi người cho mình hỏi là cách lấy địa chỉ của một tham chiếu với :
    trong turbo c++ 3.1 của thằng bạn mình code thì được dùng cách sau để lấy địa chỉ của tham chiếu :
    Code:
    &(&q)
    nhưng khi mình code như sau :
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3. int main(){
    4.     int n = 10;
    5.     int &q = n;
    6.     cout << &(&q) << endl;
    7.     return 0;
    8. }
    thì với trình biên dịch gnu gcc thì nó đưa ra lỗi là :
    Code:
    maintest.cpp: In function ‘int main()’:
    maintest.cpp:6: error: lvalue required as unary ‘&’ operand
    Mọi người có ai giải thích với mình tại sao lại như vậy được không
    Đã được chỉnh sửa lần cuối bởi tandaica0612 : 07-01-2009 lúc 08:24 PM.

  2. #2
    No Avatar
    ngocbig Khách

    Một đối tượng a khi tham chiếu đến một đối tượng b thì chỉ được tham chiếu một lần duy nhất khi khởi tạo. Lúc này a và b về bản chất chỉ là một, cùng địa chỉ và cùng giá trị trong ô nhớ đó, chỉ khác nhau cái tên mà thôi. Còn khi thực hiện câu lệnh cout << &q << endl; thì compiler hiểu đó là lấy địa chỉ của q.

  3. #3
    Ngày gia nhập
    09 2006
    Bài viết
    18

    Sorry bạn ngocbig , vì mình chắc lúc sửa lại bài viết post lỗi trước của diễn đàn lên lúc type lại đã đánh nhầm chỗ này , so sorry :
    Code:
        cout << &q << endl;
    phải là
    Code:
        cout << &(&q) << endl;
    Mình đã sửa lại rùi T_T
    Nhưng theo bạn nói thế này thì mình hem đồng ý lắm :
    Trích dẫn Nguyên bản được gửi bởi ngocbig Xem bài viết
    Lúc này a và b về bản chất chỉ là một, cùng địa chỉ và cùng giá trị trong ô nhớ đó, chỉ khác nhau cái tên mà thôiq.
    Theo mình hiểu và suy đoán thì theo có lẽ bạn nhầm :
    - thứ nhất : mọi thứ đều ở trong bộ nhớ , lên không có chuyện a và b cùng 1 địa chỉ và có cùng giá trị trong ô nhớ ( vì nếu thế thì chương trình phân biệt làm sao được biến a và b ??? )
    - thứ 2 : vì trong quá trình debug code thì mình thấy giá trị của ô nhớ của biến tham chiếu ( nếu debug bằng gdb thông qua ide netbeans ) thì mẫu giá trị trong ô nhớ của tham chiếu có dạng
    Code:
    @0x04821221:913
    dấu @ là báo hiệu đấy là tham chiếu , 0x04821221 : là địa chỉ mà nó tham chiếu tới , và 913 là giá trị ở trong ô nhớ , chính vì thế mình mới thắc mắc cách lấy địa chỉ của tham chiếu , để từ đấy mình lấy giá trị trong ô của tham chiếu.
    Không biết mình có hiểu sai không , mong mọi người giải đáp giúp , mà một vấn đề nữa là với turbo c++ 3.1 thì hôm sang nhà thằng bạn đã test thử thì &(&p) sẽ cho địa chỉ biến tham chiếu , và &n sẽ cho địa chỉ n , và 2 giá trị này là khác nhau , nhưng mà không hiểu sao khi làm thế và biên dịch với gnu gcc thì nó lại không cho biên dịch tại dòng chứa &(&p) và nó in ra lỗi như trên
    Đã được chỉnh sửa lần cuối bởi tandaica0612 : 08-01-2009 lúc 12:39 AM.

  4. #4
    No Avatar
    ngocbig Khách

    Nhưng theo bạn nói thế này thì mình hem đồng ý lắm :
    Haha! Mình nói thế này cho nó vuông nhé. Giả sử tên khai sinh của bạn là Nguyễn Đại Ca gì gì đó. Rồi ở nhà bố mẹ, người thân của bạn đặt tên cho bạn là Tèo chẳng hạn. Như vậy ở đây Đại Ca hay Tèo cũng chỉ là một. Vấn đề trên cũng thế mà thôi. Lấy tham chiếu của một đối tượng cũng chỉ là một cái tên khác được đặt cho đối tượng ấy. Do đó nó sẽ có cùng địa chỉ. Cái này bị thay đổi như thế nào thì cái kia cũng bị thay đổi theo. Bạn có thể test bằng cách in nội dung ô nhớ và địa chỉ của nó ra, thay đổi giá trị, rồi lại in lại mà xem.

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

    Thế bạn biết cách lấy cái địa chỉ của Tèo đấy trong gnu gcc không , vì nếu mình làm theo Turbo C++ 3.1 thì kiểu &(&p) thì compile được và không gây ra lỗi , nhưng với gnu gcc thì bị lỗi T_T , mong được giúp đỡ

  6. #6
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mặc định Lấy địa chỉ của một tham chiếu trong gnu c++ ???

    Bạn làm thế này nè :

    C++ Code:
    1. #include <iostream.h>
    2. #include <conio.h>
    3.  
    4. int main(int argc, char* argv[])
    5. {
    6.     long a = 10;
    7.     long &b = a;
    8.  
    9.     b = 20;
    10.  
    11.     cout<<(long)&b<<endl;
    12.    
    13.     getch();
    14.  
    15.     return 0;
    16. }
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  7. #7
    Ngày gia nhập
    09 2006
    Bài viết
    18

    Sorry mình nhầm , mình test thử cách của bạn địa chỉ của biến &b trùng với &a , nhưng mà mình muốn địa chỉ ô nhớ của biến tham chiếu cơ ( tức &(&b) ), chứ không phải là địa chỉ của giá trị được tham chiếu :( , bạn có cách khác không
    Đã được chỉnh sửa lần cuối bởi tandaica0612 : 08-01-2009 lúc 12:37 AM.

  8. #8
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình thấy bạn chưa hiểu rõ về tham chiếu lắm. Tham chiếu là do compiler che giấu khái niệm con trỏ. Để mình giải thích cho bạn hiểu.

    Khi ta khai báo :
    C++ Code:
    1. long &b = a;
    thì thực chất code do compiler biên dịch ra là :
    C++ Code:
    1. long *b = &a;

    Ví dụ khi ta gán :
    C++ Code:
    1. b = 10;
    thì compiler sẽ biên dịch ra là :
    C++ Code:
    1. b[0] = 10;

    Khi ta truy xuất giá trị của b :
    C++ Code:
    1. long x = b;
    thì compiler sẽ biên dịch ra là :
    C++ Code:
    1. long x = b[0];

    Vậy là bạn hiểu tham chiếu là gì rồi chứ ? Nó là một biến con trỏ trỏ đến a ( hiểu theo nghĩa của compiler ) và là một biến kiểu tham chiếu đến a ( hiểu theo logic của người lập trình ). Do đó về mặt lưu trữ thì giá trị của b là địa chỉ của a.

    Còn chuyện lấy địa chỉ của b thì mình đã test thử và thấy cái code của mình chạy sai. Cái khó ở đây chính là khi ta truy xuất địa chỉ của b :
    C++ Code:
    1. long *p2 = &b;
    thì compiler sẽ biên dịch ra là :
    C++ Code:
    1. long *p2 = (long *)b;

    Bạn thử lại code này xem :

    C++ Code:
    1. #include <iostream.h>
    2. #include <conio.h>
    3.  
    4. int main(int argc, char* argv[])
    5. {
    6.     long a = 10;
    7.     long &b = a;
    8.     long *p1 = &a;
    9.     long *p2;
    10.  
    11.     _asm {
    12.         lea eax,b
    13.         mov p2,eax
    14.     }
    15.  
    16.     cout<<(*p2)<<" "<<(long)&a<<endl; // b mang giá trị là địa chỉ của a
    17.  
    18.     cout<<a<<" "<<b<<endl;
    19.  
    20.     b = 20;
    21.     cout<<a<<" "<<b<<endl;
    22.  
    23.     p1[0] = 40;
    24.     cout<<a<<" "<<b<<endl;
    25.  
    26.     getch();
    27.  
    28.     p2[0] = 0;
    29.     b = 10; // Chắc chắn chỗ này sẽ có lỗi vì b đang là NULL nên ko gán vào b[0] được
    30.  
    31.     getch();
    32.    
    33.     return 0;
    34. }
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 08-01-2009 lúc 08:58 AM.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  9. #9
    No Avatar
    ngocbig Khách

    Sorry mình nhầm , mình test thử cách của bạn địa chỉ của biến &b trùng với &a , nhưng mà mình muốn địa chỉ ô nhớ của biến tham chiếu cơ ( tức &(&b) ), chứ không phải là địa chỉ của giá trị được tham chiếu :( , bạn có cách khác không
    Đúng là bạn vẫn chưa hiểu vấn đề. Có lẽ bạn đang tư duy theo cách "tham chiếu cũng giống như con trỏ". Ở đây b là tham chiếu đến a, vậy lấy địa chỉ của tham chiếu b đơn giản là &b mà thôi. Còn câu lệnh &(&b) báo lỗi vì (&b) trả về một giá trị hằng (literal), tiếp theo bạn lại thực hiện &(hằng) thì sẽ có lỗi thôi. Một hằng số (literal) có địa chỉ không?????

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

    Quả thật chưa bao giờ nghe lấy địa chỉ của 1 reference, cách mà bạn cậu làm không phải là không có ý nghĩa, có lẽ C++ sẽ treat ref như 1 automatically deferencing object, trong C++ :
    C++ Code:
    1. &*some_ptr;
    là negate giá trị của nó vì vậy &( &*p ) sẽ cho ra địa chỉ của ref.
    Nhưng có lẽ gcc hiểu 1 cách khác, tui đã dùng thử 1 trick nhỏ tui vẫn thường dùng để lấy address trong C++ :
    Java Code:
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. template <typename T>
    6. T* take_address_of( T& val )
    7. {
    8.     struct o{ };
    9.     return reinterpret_cast< T* >( &reinterpret_cast< o& >( val ) );
    10. }
    11.  
    12. class C
    13. {
    14.     // nothing
    15. };
    16.  
    17. int main()
    18. {
    19.     C obj;
    20.     C& ref = obj;
    21.  
    22.     std::cout << take_address_of( ref ) << std::endl;
    23.     std::cout << take_address_of( obj ) << std::endl;
    24.  
    25.     return 0;
    26. }
    nhưng vẫn không được T_T, nếu cậu tìm được cách nào hay thì share cho tui T_T, đọc source của gcc thử xem sao.

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

  1. Kiểu string trong c# là tham chiếu hay tham trị ???
    Gửi bởi thvnhn trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 04-11-2013, 08:38 PM
  2. Mã nguồn C Lỗi [Lỗi]Tham chiếu trong C
    Gửi bởi hoainamnguyen trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 28-11-2012, 11:20 PM
  3. Algorithm Muốn hiểu rõ về tham chiếu trong c# (ref)
    Gửi bởi quyen1991 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 30-07-2011, 01:24 AM
  4. tham trị và tham chiếu trong C#
    Gửi bởi hunter1189 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 16
    Bài viết cuối: 03-04-2011, 11:03 PM
  5. Lớp số phức và sử dụng tham chiếu trong lập trình C++?
    Gửi bởi rogerminh2401 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 5
    Bài viết cuối: 09-01-2011, 04:49 AM

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