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?

Một phần của tài liệu Bài giảng kỹ thuật lập trình chương 1 Pointer (Trang 62 - 65)

- 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; }

Một phần của tài liệu Bài giảng kỹ thuật lập trình chương 1 Pointer (Trang 62 - 65)

Tải bản đầy đủ (PDF)

(101 trang)