- Có thể mở rộng vùng nhớ khi thực thi chương
o Làm sa thay đổi giá trị của cn trỏ (không phải giá trị mà nó trỏ đến) sau khi gọi hàm?
▪ Xét ví dụ: viết hàm nhập và xuất mảng dùng con trỏ và cấp phát động #include <iostream>
#include <stdlib.h> using namespace std;
void nhapmang(int *a, int &n); void xuatmang(int *a, int n);
int main() {
int *A,n;
nhapmang(A,n); // A van la NULL, in ra loi // sau khi ra khoi ham gia tri A ko thay doi
xuatmang(A,n);
delete[] A; return 0; }
void nhapmang(int *a, int &n) { cin >> n;
a = new int[n];
for (int i=0;i<n;i++) cin >> a[i]; }
void xuatmang(int *a, int n) {
for (int i=0;i<n;i++)
cout << a[i] << " "; }
Nhận xét: biến con trỏ *A trong hàm main và biến con trỏ *a trong hàm nhapmang là khác biệt nhau.
Khi ra khỏi hàm nhapmang, giá trị của con trỏ *A không được cập nhật
Con trỏ cấp 2
❑ Khắc phục : có 2 cách
▪ Cách 1: Dùng tham chiếu int *&p (trong C++) (vì con trỏ cũng là một biến nên có thể dùng một biến để tham chiếu đén)
Ví dụ: chỉnh sửa lại hàm nhập mảng như sau:
void nhapmang(int *&a, int &n); // prototype
void nhapmang(int *&a, int &n) { cin >> n;
a = new int[n];
for (int i=0;i<n;i++) cin >> a[i]; }
#include <iostream> #include <stdlib.h>
using namespace std;
void nhapmang(int *&a, int &n); void xuatmang(int *a, int n);
int main() {
int *A,n;
nhapmang(A,n); // dung tham chieu xuatmang(A,n);
delete[] A; return 0; }
Con trỏ cấp 2
❑ Khắc phục : có 2 cách
▪ Cách 2: Dùng con trỏ cấp 2 ( pointer to pointer) int **a ( sử dụng con trỏ a trỏ đến địa chỉ của con trỏ A trong hàm main() . Hàm này sẽ thay đổi giá trị của con trỏ A gián tiếp thông qua con trỏ a) Ví dụ: chỉnh sửa lại hàm nhập mảng như sau:
void nhapmang(int **a, int &n); // prototype
void nhapmang(int **a,int &n) { cin >> n;
*a = new int[n];
for (int i=0;i<n;i++)
cin >> (*a)[i]; // tuong duong cin>>A[i] }
#include <iostream> #include <stdlib.h>
using namespace std;
void nhapmang(int **a, int &n); void xuatmang(int *a, int n);
int main() { int *A,n; nhapmang(&A,n); // dùng con trỏ cấp 2 xuatmang(A,n); delete[] A; return 0; }