01/10/2018, 14:20
Hỏi về con trỏ trong C
Chào mọi người, em có câu hỏi về con trỏ mong mọi người chỉ giúp.
Dòng tô đỏ 25.
(*p)->info = tt; có tác dụng gì ạ.
//Theo em nghĩ thì biến tt được lưu trong stack của hàm change(), nếu như lệnh trên trỏ con trỏ (*p)->info đến tt thì nó sẽ mất đi sau khi hàm thực hiện. Vậy có phải lệnh trên có tác dụng là auto gán giá trị của các phần tử bên trong tt cho (*p) -> info không ạ ?.
Xin cảm ơn mọi người ạ.
Bài liên quan
Hi Thân Hoàng.
Bạn up hết code lên. Nếu chỉ nhìm như vậy thì có vẻ như code của bạn tiềm ẩn lỗi.
Full code ạ:
links: https://bugs.vn/10007
Code này không ổn vì bạn đang đưa chi tiết của CTDL (
*pnext
) vào kiểusinhvien
.Còn dòng đó thì không mất đâu vì đó là copy nguyên con. Dòng ngay sau mới là có chuyện.
à, cái free(&tt) là lúc đấy em đang test thử thôi ạ
sr, lúc đấy em test thử nhưng quên chưa xóa, code em chạy đây ạ
// Anh cho em hỏi 2 câu hỏi ạ:
Cảm ơn anh!!
tt
không phải con trỏ khi ta xem lại khai báo, vàtt
này ở stack area do khai báo trong hàm, từmalloc
ra mới là heap.Bạn không nên khai báo 1 node là 1 con trỏ, vì sau đó viết code dễ làm người khác hiểu lầm như dòng code (*p)->info=tt;
Thay vào đó khai báo struct sinhvien như struct thongtin.
Lúc này trong hàm main ta sẽ khai báo 1 con trỏ sinh viên và cấp phát bộ nhớ cho nó, bạn sẽ không thấy nhập nhằng giữa vùng nhớ heap và stack nữa.
Cái cần chú ý là không phải khai báo trong hàm thì nó nằm trên stack, ta khai báo tỉnh mà ko cấp phát bộ nhớ thì mới nằm trên stack, nếu khai báo động thì nằm ở đâu cũng sẽ ở trên heap mà thôi.
Vấn đề lớn hơn là thớt không tách biệt CTDL và dữ liệu.
Thực ra nó ntn: Khi ta viết
thongtin t;
thì t ở trên stack là đúng nhưng khi ta viếtthongtin *p = malloc(sizeof(thongtin));
thì p ở trên stack và p trỏ vào heap :D, nói cách khác, đối tượng (nói chung) nằm trên heap.Nhưng câu đầu khai báo biến t, câu sau khai báo con trỏ p, vậy “ở stack area do khai báo trong hàm” không sai. Trừ
static
ra.Em cảm ơn mọi người nhiều ạ.
Hi Thân Hoàng.
http://minhhn.com/lap-trinh-c/tham-tri-tham-chieu-trong-lap-trinh-c-cplusplus/
Để ý
tt.name
này không phải là con trỏ, nên đều là deep copy cả.Hi anh, có phải anh đang muốn nhắc đến cái này không ạ ?
Ở đây em truyền con trỏ của con trỏ (nghĩa là kiểu **) chứ không phải truyển con trỏ anh ạ
Hi anh, em đã test và đúng là nó chỉ đơn thuần copy giá trị chứ không hề ảnh hưởng gì đến con trỏ.
Không biết nhận định của em qua hình test kia có đúng không ạ.
Theo nguyên tắc C chỉ có truyền tham trị (
p
là tham số hình thức), nhưng tính chất của con trỏ được sử dụng để truyền tham biến (cho*p
). Khi đã sửa lại p thì không còn tham biến nữa, đó là hình ở post 14.Ở post 15
thongtin
không có con trỏ nào (và đều là kiểu cơ bản) nên đều là deep copy.