^ 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é
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ỏ
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; }
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ỏ?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; }
Đã được chỉnh sửa lần cuối bởi 25mezs6ts09pao : 28-09-2016 lúc 11:31 AM.
^ 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é
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:
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.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; }
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, ....
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) đó.
Ý 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:
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ỏ.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; }
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.
xi mà chưa cao à ?
C Code:
//to do .... 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; */ nhapThongTin1(QuyenSach1); // in thong tin cua QuyenSach1, bang cach truyen dia chi cua cau truc inthongtin1(QuyenSach1 ); /* // 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; */ nhapThongTin2(&QuyenSach2); // in thong tin cua QuyenSach2, bang cach truyen dia chi cua cau truc inthongtin2(&QuyenSach2 ); return 0; }
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
code tương đương ko có xài strcpy để tạo 1 bản copy đâu, mà xài memcpy đó.