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

Đề tài: Lợi ích của con chỏ và tại sao lại dùng con trỏ trong trường hợp này?

  1. #1
    Ngày gia nhập
    11 2011
    Bài viết
    30

    Mặc định Lợi ích của con chỏ và tại sao lại dùng con trỏ trong trường hợp này?

    Mình vẫn thắc mắc về lợi ích của việc dùng con trỏ.
    Vì lúc code nhiều cách không dùng con trỏ vẫn ok, vậy tại sao phải dùng tới nó?

    VD là 2 đoạn code dưới đây

    Không dùng con trỏ
    Code:
    #include <iostream>
    #include <cstring>
     
    using namespace std;
    void inthongtin( struct Books book );
    
    struct Books
    {
       char  tieude[50];
       char  tacgia[50];
       char  chude[100];
       int   book_id;
    };
     
    int main( )
    {
       struct Books QuyenSach1;        // Khai bao QuyenSach1 la cua kieu Books
       struct Books QuyenSach2;        // Khai bao QuyenSach2 la cua kieu Books
     
       // chi tiet ve quyen sach thu nhat
       strcpy( QuyenSach1.tieude, "Ngon ngu Lap trinh C++");
       strcpy( QuyenSach1.tacgia, "Pham Van At"); 
       strcpy( QuyenSach1.chude, "Lap trinh");
       QuyenSach1.book_id = 1225;
    
       // chi tiet ve quyen sach thu hai
       strcpy( QuyenSach2.tieude, "Toi thay hoa vang tren co xanh");
       strcpy( QuyenSach2.tacgia, "Nguyen Nhat Anh");
       strcpy( QuyenSach2.chude, "Van hoc");
       QuyenSach2.book_id = 3214;
     
       // in thong tin ve QuyenSach1
       inthongtin( QuyenSach1 );
    
       // in thong tin ve QuyenSach2
       inthongtin( QuyenSach2 );
    
       return 0;
    }
    void inthongtin( struct Books book )
    {
       cout << "Tieu de sach: " << book.tieude <<endl;
       cout << "Tac gia: " << book.tacgia <<endl;
       cout << "Chu de: " << book.chude <<endl;
       cout << "ID cua sach la: " << book.book_id <<endl;
       cout << "\n\n========================================\n\n" <<endl;
    }
    Dùng con trỏ
    Code:
    #include <iostream>
    #include <cstring>
     
    using namespace std;
    void inthongtin( struct Books *book );
    
    struct Books
    {
       char  tieude[50];
       char  tacgia[50];
       char  chude[100];
       int   book_id;
    };
     
    int main( )
    {
       struct Books QuyenSach1;        // Khai bao QuyenSach1 la cua kieu Books
       struct Books QuyenSach2;        // Khai bao QuyenSach2 la cua kieu Book
     
       // thong tin chi thiet ve quyen sach thu nhat
       strcpy( QuyenSach1.tieude, "Ngon ngu Lap trinh C++");
       strcpy( QuyenSach1.tacgia, "Pham Van At"); 
       strcpy( QuyenSach1.chude, "Lap trinh");
       QuyenSach1.book_id = 1225;
    
       // thong tin chi thiet ve quyen sach thu hai
       strcpy( QuyenSach2.tieude, "Toi thay hoa vang tren co xanh");
       strcpy( QuyenSach2.tacgia, "Nguyen Nhat Anh");
       strcpy( QuyenSach2.chude, "Van hoc");
       QuyenSach2.book_id = 3214;
     
       // in thong tin cua QuyenSach1, bang cach truyen dia chi cua cau truc
       inthongtin( &QuyenSach1 );
    
       // in thong tin cua QuyenSach2, bang cach truyen dia chi cua cau truc
       inthongtin( &QuyenSach2 );
    
       return 0;
    }
    // Ham nay chap nhan con tro toi cau truc lam tham so.
    void inthongtin( struct Books *book )
    {
       cout << "Tieu de sach: " << book->tieude <<endl;
       cout << "Tac gia: " << book->tacgia <<endl;
       cout << "Chu de: " << book->chude <<endl;
       cout << "ID cua sach: " << book->book_id <<endl;
       cout << "\n\n========================================\n\n" <<endl;
    }
    2 đoạn code đều cho ra kết quả giống nhau, vậy đâu là lợi ích của việc dùng con trỏ?
    Đã được chỉnh sửa lần cuối bởi 25mezs6ts09pao : 28-09-2016 lúc 11:31 AM.

  2. #2
    Ngày gia nhập
    01 2013
    Bài viết
    1,479

    ^ Truyền tham trị là nó copy cả 1 struct to, còn tham chiếu thì 1 con trỏ thôi

    Nhưng mà tham chiếu ntn thì chỉ có const struct Book* nhé

  3. #3
    Ngày gia nhập
    12 2010
    Bài viết
    23

    Phải rồi, mình xin bổ sung thêm. Nghĩa là khi truyền tham trị, chương trình sẽ tạo thêm biến struct với giá trị giống với struct mình truyền vào. Mình mô tả trong đoạn code sau:

    Code:
    void inthongtin( struct Books *book )
    {
       struct Books tempBook;
       
       strcpy(tempBook.tieude, book->tieude);
       strcpy(tempBook.tacgia, book->tacgia);
       strcpy(tempBook.chude, book->chude);
       strcpy(tempBook.book_id, book->book_id);
    
       cout << "Tieu de sach: " << tempBook.tieude <<endl;
       cout << "Tac gia: " << tempBook.tacgia <<endl;
       cout << "Chu de: " << tempBook.chude <<endl;
       cout << "ID cua sach: " << tempBook.book_id <<endl;
       cout << "\n\n========================================\n\n" <<endl;
    }
    Hàm inthongtin trong đoạn code trên tương tự với hàm inthongtin không dùng con trỏ. Trong đó, chương trình phải tốn thêm bộ nhớ để lưu các thông tin của struct book được truyền vào. Trong khi hàm inthongtin sử dụng con trỏ thì chương trình lấy giá trị trực tiếp của biến struct book để in ra màn hình luôn.

  4. #4
    Ngày gia nhập
    09 2016
    Bài viết
    1,005

    Với một ngữ cảnh riêng nó giống nhau, còn lại sẽ khác trong ngữ cảnh khác. Bạn viết hàm nhập - thay đổi thì bạn dùng cái nào ?

    Một số NN có thêm các keyword var, byref, ....

  5. #5
    Ngày gia nhập
    12 2010
    Bài viết
    23

    Tóm lại là trong hai đoạn code của chủ topic, đoạn code dùng con trỏ sẽ tiết kiệm một lượng byte là sizeof(struct Books) đó.

    Trích dẫn Nguyên bản được gửi bởi fms17 Xem bài viết
    Với một ngữ cảnh riêng nó giống nhau, còn lại sẽ khác trong ngữ cảnh khác. Bạn viết hàm nhập - thay đổi thì bạn dùng cái nào ?
    Ý bạn là trong trường hợp nhập hay thay đổi giá trị các thuộc tính trong struct Books thì nó sẽ không gây tốn bộ nhớ hay như thế nào ?
    Đối với hàm nhập hay thay đổi, ta tác động tới giá trị của cái thuộc tính đó trong struct Books rồi nên nếu như ở phần "code tương đương" của mình nó có dạng thế này:

    Code:
    void inthongtin( struct Books *book )
    {
       struct Books tempBook;
       
       strcpy(tempBook.tieude, book->tieude);
       strcpy(tempBook.tacgia, book->tacgia);
       strcpy(tempBook.chude, book->chude);
       strcpy(tempBook.book_id, book->book_id);
    
       // Thao tac tren struct tempBook
    
       tempBook.book_id = 10; // thay doi thong tin
    
       cout << "Tieu de sach: " << tempBook.tieude <<endl;
       cout << "Tac gia: " << tempBook.tacgia <<endl;
       cout << "Chu de: " << tempBook.chude <<endl;
       cout << "ID cua sach: " << tempBook.book_id <<endl;
       cout << "\n\n========================================\n\n" <<endl;
    }
    Ví dụ thế này, vừa gây tốn bộ nhớ vừa không thay đổi được giá trị của biến struct Books được truyền vào. Giải pháp là dùng con trỏ.

    Còn đối với các ngôn ngữ cấp cao, tác giả thêm biến tham chiếu thì sẽ tiện hơn là dùng con trỏ, đó là chuyện khác rồi. Trong khi trong C thì không thể dùng biến tham chiếu.

  6. #6
    Ngày gia nhập
    09 2016
    Bài viết
    1,005

    Mặc định Lợi ích của con chỏ và tại sao lại dùng con trỏ trong trường hợp này?

    xi mà chưa cao à ?

    C Code:
    1. //to do ....
    2.  
    3. int main( )
    4. {
    5.    struct Books QuyenSach1;        // Khai bao QuyenSach1 la cua kieu Books
    6.    struct Books QuyenSach2;        // Khai bao QuyenSach2 la cua kieu Book
    7.  /*
    8.    // thong tin chi thiet ve quyen sach thu nhat
    9.    strcpy( QuyenSach1.tieude, "Ngon ngu Lap trinh C++");
    10.    strcpy( QuyenSach1.tacgia, "Pham Van At");
    11.    strcpy( QuyenSach1.chude, "Lap trinh");
    12.    QuyenSach1.book_id = 1225;
    13. */
    14.    nhapThongTin1(QuyenSach1);
    15.    // in thong tin cua QuyenSach1, bang cach truyen dia chi cua cau truc
    16.    inthongtin1(QuyenSach1 );
    17.  /*
    18.  
    19.    // thong tin chi thiet ve quyen sach thu hai
    20.    strcpy( QuyenSach2.tieude, "Toi thay hoa vang tren co xanh");
    21.    strcpy( QuyenSach2.tacgia, "Nguyen Nhat Anh");
    22.    strcpy( QuyenSach2.chude, "Van hoc");
    23.    QuyenSach2.book_id = 3214;
    24. */
    25.     nhapThongTin2(&QuyenSach2);
    26.    // in thong tin cua QuyenSach2, bang cach truyen dia chi cua cau truc
    27.    inthongtin2(&QuyenSach2 );
    28.  
    29.    return 0;
    30. }

    Sao cứ phải tư duy hà tiện, kiểu tiết kiệm là quốc sách, xách cuốc thế. Sao cứ phải cụ bằng cốt

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

    code tương đương ko có xài strcpy để tạo 1 bản copy đâu, mà xài memcpy đó.

Tags của đề tài này

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