-Khi gặp toán tử new, chương trình sẽ tìm trong bộ nhớ một lượng ô nhớ còn rỗi và liên tục với số lượng đủ theo yêu cầu và cho p trỏ đến địa chỉ (byte đầu tiên) của vùng nhớ này. -Nếu không có vùng nhớ với số lượng như vậy thì việc cấp phát là thất bại và p = NULL (NULL là một địa chỉ rỗng, không xác định). C. Thu hồi bộ nhớ động với toán tử delete: -Để giải phóng bộ nhớ đã cấp phát cho một biến (khi không cần sử dụng nữa) ta sử dụng câu lệnh delete. delete p ; // p là con trỏ được sử dụng trong new -Và để giải phóng toàn bộ mảng được cấp pháp thông qua con trỏ p ta dùng câu lệnh: delete[] p ; // p là con trỏ trỏ đến mảng - Nên hạn chế dùng nhiều con trỏ trỏ vào cùng một địa chỉ. - Cần giải phóng vùng nhớ khi ra khỏi phạm vi con trỏ hoặc trước khi gán. 4.5 Con trỏ và mảng, chuỗi A. Con trỏ và mảng 1 chiều : Việc cho con trỏ trỏ đến mảng -Cũng tương tự trỏ đến các biến khác, tức gán địa chỉ của mảng (chính là tên mảng) cho con trỏ. Chú ý rằng địa chỉ của mảng cũng là địa chỉ của thành phần thứ 0 nên a+i sẽ là địa chỉ thành phần thứ i của mảng a. Ví dụ: In toàn bộ mảng thông qua con trỏ. Cho : int a[5] = {1, 2, 3, 4, 5}, *p, i; Cách 1: p = a; for (i=0; i<5; i++) cout << *(p+i) <<"\t"; // p không thay đổi Cách 2: for (p=a; p<=a+4; p++) cout << *p <<"\t"; // thay đổi p B. Con trỏ và mảng 2 chiều : B. Con trỏ và mảng 2 chiều : Ví dụ sau đây cho phép nhập và in một mảng 2 chiều m*n (m dòng, n cột) thông qua con trỏ p. Nhập liên tiếp m*n số vào mảng và in thành ma trận m dòng, n cột. float a[2][3], *p; int i, j; p = (float*) a; //Ép kiểu của a về con trỏ float for (i=0; i<2*3; i++) cin >> *(p+i); // Nhập dãy 6 phần tử. for (i=0; i<2; i++) // In dãy dạng ma trận { for (j=0; j<3; j++) cout << *(p+i*3+j)<<" "; cout << endl; } C. Con trỏ và chuỗi: C. Con trỏ và chuỗi:
Chia sẻ với bạn bè của bạn: |