Sau khi chúng ta đã khai báo con trỏ, chúng ta có thể cấp phát động cho mảng các hàng. Chúng ta làm điều đó như sau →
1 |
ptrarr = new int * [rows]; |
OK, vậy hãy giải thích ý nghĩa của việc cấp phát này.
- Thứ nhất, con trỏ được trả về bởi new là kiểu int ** (vì đó là một con trỏ đến con trỏ trỏ đến int) và được gán cho ptrarr
- Thứ hai, các phần tử của mảng các hàng sẽ là các con trỏ trỏ đến các hàng, do đó, kiểu của chúng là int *
Cuối cùng, chúng ta cần cấp phát bộ nhớ cho mỗi hàng và lưu trữ con trỏ trả về vào các phần tử của mảng các hàng. Cách dễ nhất để làm điều này là sử dụng một vòng lặp →
1 2 3 |
for (int r = 0; r < rows; r++) { ptrarr[r] = new int[columns]; } |
Sử dụng mảng như thế này rất đơn giản. Ví dụ, nếu chúng ta muốn gán 0 cho phần tử nằm trong hàng r, cột c, ta làm như sau →
1 |
ptrarr[r][c] = 0; |
Vậy nó hoạt động như thế nào ?
- biểu thức ptrarr [r] tương đương với * (ptrarr + r) có nghĩa là dereferencing của phần tử trỏ đến hàng r
- con trỏ được dereferenced một lần nữa như sau: * (* (ptrarr + r) + c) → nó chỉ đơn giản là một giá trị kiểu int
Quá trình dereferencing của ptrarr [2] [1] được biểu diễn như sơ đồ bên dưới →