Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: [C] thắc mắc về con trỏ?

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

    Mặc định [C] thắc mắc về con trỏ?

    Chào các bạn như các bạn biết đó con trỏ là niềm tự hào của C/C++ nhưng đó cũng chính là cái bẫy sai lầm chết người . Do đó khi học C cái làm cho tôi lúng túng nhiều nhất chính là con trỏ .Sau đây mình xin hỏi các bạn một vấn đề liên wan đến con trỏ .
    Bây giờ mình khai báo một dạng con trỏ trỏ đến con trỏ như sau int **p và một con trỏ bình thường int *rp . Giả sử con trỏ p đang trỏ tới một con trỏ nào đó (q chẳng hạn) mà q lại đang trỏ tới một giá trị X . Khi ta sử dụng biểu thức sau : rp=p; .Thì cho hỏi là con trỏ rp sẽ nhận giá trị là địa chỉ của X hay là địa chỉ của q (bởi vì p đang chứa địa chỉ của q).
    Mong các bạn giải đáp thắc mắc giúp . Cám ơn rất nhiều!!!

  2. #2
    Ngày gia nhập
    08 2006
    Bài viết
    19

    tôi thấy là chương trình sẽ báo lỗi mới phải:
    khai báo:
    int **p;
    int *rp;
    p là con trỏ của con trỏ, giá trị ô nhớ nó trỏ tới là 1 địa chỉ
    rp là 1 con trỏ nguyên, giá trị ô nhớ nó trỏ tới là 1 số nguyên

    bạn làm gì mà phải dùng tới cái này vậy, chia sẻ đi ^_^

    tôi mới chỉ thấy dùng **p khi truyền tham số cho chương trình con:
    void read(int **p);
    {................
    }
    void main()
    {
    int *p;
    read(&p);
    }

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

    Bây giờ mình khai báo một dạng con trỏ trỏ đến con trỏ như sau int **p và một con trỏ bình thường int *rp . Giả sử con trỏ p đang trỏ tới một con trỏ nào đó (q chẳng hạn) mà q lại đang trỏ tới một giá trị X . Khi ta sử dụng biểu thức sau : rp=p; .Thì cho hỏi là con trỏ rp sẽ nhận giá trị là địa chỉ của X hay là địa chỉ của q (bởi vì p đang chứa địa chỉ của q).
    tui nghĩ như vầy: con trỏ nghĩ cho cùng, cũng chỉ là 1 biến (nhưng nội dung của biến này có thể được diễn dịch thành 1 địa chỉ, trỏ tới 1 vùng nhớ nào đó)

    Giả sử:

    - biến X ở tại địa chỉ 1234; giá trị của X là 2006 (ô nhớ tại địa chỉ 1234 chứa số 2006)
    - con trỏ q ở tại địa chỉ 5678, con trỏ q đang trỏ tới biến X => giá trị của q là 1234 (địa chỉ của X là 1234) => ô nhớ tại địa chỉ 5678 chứa số 1234
    - con trỏ p ở tại địa chỉ 9abc, con trỏ p đang trỏ tới biến q => giá trị của p là 5678 (địa chỉ của q là 5678) => ô nhớ tại địa chỉ 9abc chứa số 5678
    - con trỏ rp ở tại địa chỉ def0

    Bây giờ nếu mình làm lệnh gán rp = p (phải ép kiểu) thì giá trị của p sẽ được sao chép làm giá trị của rp => ô nhớ tại địa chỉ def0 chứa số 5678

    Sau đó nếu mình xài rp "bình thường" (coi rp như là 1 con trỏ tới 1 số nguyên) thì mình sẽ coi 5678 như là địa chỉ của 1 số nguyên => lần theo đến địa chỉ 5678 và lấy ra giá trị tại đó: 1234 => giá trị này sẽ được coi như là 1 số nguyên thuần túy mà thôi (tuy thực chất nó lại là địa chỉa của biến X)

    Tóm lại sau lệnh gán : rp chứa địa chỉ của q (vì giá trị của rp là giá trị của p; mà giá trị của p là địa chỉ của q vì p đang trỏ tới q)

    (có gì sai sót mong được góp ý, xin cám ơn)

    -thân

  4. #4
    Ngày gia nhập
    07 2006
    Bài viết
    121

    Theo mình cách tốt nhất để giải quyết câu hỏi này là viết đoạn code test xem chương trình báo lỗi gì. Theo mình sẽ báo lỗi vì về mặc ngữ nghĩa thì rp là một biến trỏ cấp hai nó chỉ chứa địa chỉ của biến trỏ cấp 1. mình ở cafe nên không có công cụ test bạn nào test dùng xem nó báo lỗi dùm nha.

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

    Code:
    #include<iostream.h>
    #include<conio.h>
    void main()
       {
           clrscr();
           int **p;
           int  *q=new int(1);
           int *rp;
           p=&q;//p now points to q
           rp=(int *)p;//convert int** to int*
           cout<<"Memory address of pointer q:rp="<<rp<<"\n";
           cout<<"Memory address of pointer q:p ="<<p<<"\n";
           cout<<"Memory address of pointer q:&q="<<&q<<"\n";
           cout<<"Memory address of int number which q points to: *p="<<*p<<"\n";
           cout<<"Value of integer number which q points to: *(*p)="<<*(*p)<<"\n";
           cout<<"Value of integer number which q points to: *q="<<*q<<"\n";
           getch();
       }

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

    Mặc định [C] thắc mắc về con trỏ?

    Tôi không hiểu roc về con trỏ lắm:
    toi hiểu hắn như thế này nó là biến chứa mà giá trị là địa chỉ của một biến khác
    OK.
    tôi cồn vấn đề này nữa trong Môn CTDLThường có cài đặt danh sánh liến kết như sau:
    PHP Code:
    struct LinkList{
    int x;
    LinkList*next;
    };
    LinkList*PNode
    void insert
    (PNode*plist,int x){}
    void main(){
    PNode plist;
    int x;
    insert(&plist,x);

    Thắc mắc:
    Vậy thì PNode*plist;
    nó chứa những gì bên trong nó vậy
    Cam ơn!.

    Cảnh cáo : Source thì phải đặt vào thẻ [C O D E] . Cảm ơn. Xcross87
    Đã được chỉnh sửa lần cuối bởi Xcross87 : 10-10-2007 lúc 05:07 PM.

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

    Trích dẫn Nguyên bản được gửi bởi nguyenthanhhungcntt Xem bài viết
    Tôi không hiểu roc về con trỏ lắm:
    toi hiểu hắn như thế này nó là biến chứa mà giá trị là địa chỉ của một biến khác
    OK.
    tôi cồn vấn đề này nữa trong Môn CTDLThường có cài đặt danh sánh liến kết như sau:
    struct LinkList{
    int x;
    LinkList*next;
    };
    LinkList*PNode
    void insert(PNode*plist,int x){}
    void main(){
    PNode plist;
    int x;
    insert(&plist,x);
    Thắc mắc:
    Vậy thì PNode*plist;
    nó chứa những gì bên trong nó vậy
    Cam ơn!.

    }
    Đây là một đoạn code thường thấy trong danh sách liên kết, theo thông thường thì nội dung của plist là điạ chỉ của phần tử đầu tiên của danh sách liên kết.

    OoShinHaoO

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

    Danh sách liên kết đơn là danh sách tuyến tính đó bạn, nghĩa là muốn truy cập đến các phần tử trong xâu ta phải bước qua ông phần tử đầu xâu. Ví dụ nhé:
    a[0] = p->next;
    a[1]= p->next->next;
    Phần tử cuối xâu có giá trị NULL (để kết thúc xâu đó mà)

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

    Tôi đã hiểu con trỏ
    Thực ra để hiểu con trỏ các bạn cần phải tìm hiểu stack&heap đây chính là gốc của tất cả

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