Saturday, September 11, 2010

Con trỏ trỏ vào con trỏ

C++ cho phép sử dụng con trỏ đa tầng, nghĩa là con trỏ trỏ vào con trỏ. Để khai báo con trỏ loại này, chúng ta chỉ cần bổ sung thêm vào biến trỏ một toán tử * nữa.
char a; char *b;
char **c;
a = ‘z’;
b = &a;
c = &b;
Để minh họa điều này, chúng ta có thể tạo một địa chỉ ngẫu nhiên trong bộ nhớ cho mỗi biến, ví dụ là 7230, 8092 và 10502.
Giá trị của mỗi biến được viết trong mỗi ô. Dưới mỗi ô là địa chỉ tương ứng của ô đó trong bộ nhớ. Địa chỉ của biến a là 7230, giá trị của ô nhớ tương ứng là ‘z’. Biến *b trỏ vào địa chỉ của biến a và giá trị tương ứng của biến b ánh xạ đến giá trị của ô nhớ biến a – tức giá trị là ‘z’.  Biến c trỏ vào địa chỉ của b, nó sẽ ánh xạ gián tiếp đến giá trị của a – tức giá trị ‘z’.

Sự tương ứng giữa con trỏ trỏ vào con trỏ khác và mảng hai chiều
Việc khai báo biến **c như trên, có thể xem như là mảng hai chiều. Chúng ta lại xét bài toán ma trận.
Chương trình Kết quả
#include using namespace std;
int main()
{
//Khai báo ma trận
int **matrix;
//Khởi tạo ma trận
matrix = new int*[3];//dòng
for(int i=0; i<3; i++)//phần tử
matrix[i] = new int[3];
//Nhập ma trận
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
*(*(matrix+i)+j)=i+j;
}
//Xuất ma trận
for (int i=0; i<3; i++){
for (int j=0; j<3; j++)
cout<<*(*(matrix+i)+j)<<” “;
cout<
}
//Xóa ma trận
delete[] matrix;
return 0;
}
0 1 2 1 2 3
2 3 4
Bạn lưu ý, từ nay trở đi, khi xử lý bài toán trên mảng, bạn hoàn toàn có thể sử dụng con trỏ để xử lý. Chúng hoàn toàn tương đương nhau, chỉ có điều, đối với con trỏ, bạn có thể kiểm soát được bộ nhớ. Chúng ta sẽ tìm hiểu chi tiết về toán tử new trong chương tiếp theo.

No comments:

Post a Comment

Popular Posts