30/09/2018, 17:18

Con trỏ trong mảng 1 chiều

Các anh chị cho em hỏi: Khi nhập xuất mảng 1 chiều thì trong hàm nhập nên khai báo biến n là biến con trỏ thế? trong khi không có nó e thấy nó vẫn chạy đc mà (n là số phần tử của mảng nhập vào từ bàn phím). Kiểu như này ạ:

void Nhap(int a[10], int &n);
void Xuat(int a[10], int n);
Nguyễn Duy Khánh viết 19:25 ngày 30/09/2018

Ko hiểu ý bạn lắm, còn khai báo thì ntn
void NhapMang(int *a, int n); void XuatMang(int *a, int n);

Hoa Sau viết 19:32 ngày 30/09/2018

ý e là sao hàm Nhap() kia cần int &n trong khi chỉ cần int n là đc? Nhưng khi e bỏ &n đi và thay là n thì thầy bảo sai

Nguyễn Duy Khánh viết 19:34 ngày 30/09/2018

Nếu giá trị của n cần thay đổi trong hàm thì cần truyền tham chiếu &n còn nếu ko thay đổi thì ko cần

Hoa Sau viết 19:27 ngày 30/09/2018

em chưa hiểu lắm trong bài toán này @SoiLuv

Nguyễn Duy Khánh viết 19:27 ngày 30/09/2018

Ví dụ thủ tục NhapMang, sẽ truyền vào 2 cái là mảng và số lượng phần tử trong mảng, nếu số lượng phần tử bạn nhập trong hàm main() thì chỉ cần truyền vào bình thường void NhapMang(int *, int n), còn nếu bạn muốn nhập n trong NhapMang thì viết tn void NhapMang(int *, int &n)

Hoa Sau viết 19:29 ngày 30/09/2018

Đoạn này lỗi ở dòng 4 đúng ko anh chị?

int A[2]={1,5};
int *pa=A;
pa+=15;
delete pa;
... viết 19:21 ngày 30/09/2018

thì thầy bảo sai

Ngoài lề tí:
Bạn cứ làm sao máy cho ra kết quả đúng là được, không nhất thiết phải làm theo thầy. Máy cho ra kết quả sai nghĩa là code bạn sai, thế thôi.

Nguyễn Duy Khánh viết 19:28 ngày 30/09/2018

Nói chung là mấy dòng này đều sai, bạn định làm gì?

Hoa Sau viết 19:22 ngày 30/09/2018

@SoiLuv chỉ e chỗ sai mỗi dòng đi ạ. Cái này chỉ xem cú pháp đúng hay không thôi chứ chẳng tuộc bài tập nào cả a

Nguyễn Duy Khánh viết 19:23 ngày 30/09/2018

int A[2]={1,5}; int *pa=A; // dòng này là gì vậy????

Hoa Sau viết 19:34 ngày 30/09/2018

dòng 1 là khai báo mảng
dòng 2 là khai báo con trỏ pa và nó trỏ đến địa chỉ của mảng A

Hoa Sau viết 19:22 ngày 30/09/2018

do mảng là con trỏ nên có thể gán con trỏ cho con trỏ cùng kiểu với nhau. Trong 4 dòng trên e nghĩ dòng 4 sai: delete pa; vì nó chưa đc cấp phát bộ nhớ động nên ko dùng giải phóng bộ nhớ ở đây đc. Enghĩ vậy ko biết đúng hay ko?

Nguyễn Duy Khánh viết 19:31 ngày 30/09/2018

khi viết như vậy thì nó sẽ hiểu là con trỏ trỏ đến phần từ đầu tiên của mảng, ko có gì sai cả

Hoa Sau viết 19:19 ngày 30/09/2018

thế có phải dòng 4 sai ko vậy a @SoiLuv

Nguyễn Duy Khánh viết 19:23 ngày 30/09/2018

delete [] pa
Viết như vậy để giải phóng

Hoa Sau viết 19:28 ngày 30/09/2018

e biết là câu lệnh dùng để giải phóng rồi, nhưng chưa cấp phát thì có đc giải phóng ko ý a, đầu bài hỏi trong 4 câu lệnh này câu lệnh nào sai?

Minh Hoàng viết 19:22 ngày 30/09/2018

khi giải phóng tức là truyền một địa chỉ vào và hàm delete sẽ giải phóng địa chỉ đó. Lưu ý là chỉ giải phóng địa chỉ ở bộ nhớ heap thôi.

Hoa Sau viết 19:20 ngày 30/09/2018

Thế kết luận trong 4 dòng này thì dòng nào sai zợ anh chị ơi?

int A[2]={1,5};
int *pa=A;
pa+=15;
delete pa;
viết 19:29 ngày 30/09/2018

dòng delete pa. pa ko trỏ tới mảng được cấp phát động nào mà đi giải phóng thì tức là sai rồi.

Hoa Sau viết 19:28 ngày 30/09/2018

cho em hỏi, khi làm việc với mảng 1 chiều hay nhiều chiều có nhất thiết phải cấp phát bộ nhớ động cho chúng ko?

Bài liên quan
0