Một mảng nhị chiều là 1 trong những mảng chứa nhiều mảng một chiều, đôi lúc mảng hai phía còn được ngầm gọi như một bảng bao gồm các hàng và các cột. Mảng hai phía còn thường được điện thoại tư vấn với cái brand name là ma trận có form size M x N (M là số hàng, N là số cột).

Bạn đang xem: Mảng 2 chiều trong c

*

Truy cập vào thành phần trong mảng một chiều là việc truy vấn vào hàng sản phẩm công nghệ i cột trang bị j bao gồm trong mảng. Lấy ví dụ như mảng a<1><3> (nghĩa là: i = 1, j = 3)

Ví dụ tiếp sau đây tôi tất cả a là mảng 2d (hay còn được gọi là ma trận) có kích thước 3 x 3 như sau:

#include int main() //khai bao với 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9 ;Chúng ta có thể tưởng tượng mảng hai phía trên như 1 bảng như sau:

*

Như nghỉ ngơi trên ta vẫn thường hotline mảng có các hàng và những cột, mặc dù nhiên bộ nhớ của máy vi tính là con đường tính và không có hàng với cột. Vì lý do đó cần các bộ phận của mảng 2 chiều thực ra được tàng trữ theo một hàng với được gom nhóm lại theo các cột gồm trong hàng, coi hình minh họa sau đây để làm rõ hơn:

*

Dòng trên cùng là con số các hàng, vì bọn họ có mảng 2 chiều form size 3 x 3 nên bao gồm 3 sản phẩm (3 row). Trong những hàng được gom đội lại 3 thành phần tương ứng cùng với 3 cột.

Dòng trung tâm là cực hiếm của mỗi phần tử ở hàng thứ i cột vật dụng j, lấy ví dụ tại a<1><3> = 3 (nghĩa là i = 1, j = 3) hay a<2><1> = 4 (nghĩa là i = 2, j = 1).

Dòng ở đầu cuối là add của mỗi bộ phận ở hàng sản phẩm i cột thứ j, ví dụ a<1><1> lưu trữ tại địa chỉ 1000, a<1><2> tàng trữ tại địa chỉ cửa hàng 1004, a<1><3> tàng trữ tại showroom 1008… và a<3><3> lưu trữ tại địa chỉ cửa hàng 1032

Vì đây là mảng có kiểu int với có size 4 byte cần mỗi địa chỉ liền kề giải pháp nhau 4 đơn vị chức năng (4 byte).

Chú ý: Địa chỉ ô lưu giữ trên chỉ cần ví dụ để ta dễ hình dung.

2.Sử dụng bé trỏ để thao tác làm việc với các phần tử trong mảng hai chiều

2.1 Địa chỉ ô nhớ của các phần tử mảng hai chiều

Mảng nhì chiều hoàn toàn có thể được quan niệm như là 1 trong con trỏ trỏ tới một đội nhóm các mảng một chiều thường xuyên nhau.

Ở mảng một chiều ta biết rằng tên của mảng chứa địa chỉ của mảng đó, hay phần tử a<0> (phần tử đầu tiên) cũng chứa địa chỉ cửa hàng của mảng đó.

Xem thêm: 4 Cách Chuyển Dữ Liệu Từ Dạng Text Sang Number Trong Excel, 4 Cách Chuyển Text To Number Trong Excel 12/2021

Trong trường hòa hợp của mảng 2 chiều, thành phần đầu tiên trong mảng 2 chiều lại đó là một mảng 1 chiều và giả dụ mảng hai phía a có form size (3 x 3) và có add tại phần tử đầu tiên (a + 0) là 1000 thì địa chỉ của phần tử thứ nhì (a+1) là 1012 , địa chỉ tại bộ phận thứ ba (a + 2) là 1024. Coi phần red color ở hình bên dưới đây:

*

Như vậy có nghĩa là:

(a + 0) trỏ mang lại mảng thứ 0(a + 1) trỏ đến mảng sản phẩm công nghệ 1(a + 2) trỏ mang đến mảng sản phẩm công nghệ 2

*

Tóm lại, ta có thể hiểu (a + i) trỏ mang lại mảng một chiều thứ i trong mảng 2 chiều.

Tuy nhiên, trong mảng thứ i lại trường tồn thêm các giá trị ở trong đó (vì mảng máy i này là mảng 1 chiều). Lấy ví dụ như (a + 0) thì vẫn là:

*

Hay (a + 1) thì đã là:

*

Hoặc (a + 2) thì đang là:

*

Chú ý: Địa chỉ ô lưu giữ trên chỉ với ví dụ nhằm ta dễ dàng hình dung.

2.2 sử dụng con trỏ để truy cập địa chỉ cửa hàng và quý giá của phần tử mảng hai chiều

Bạn phát âm hãy cùng tôi tham khảo hai ví dụ tiếp sau đây để đúc rút công thức tổng thể cho việc lấy địa chỉ và giá trị của mảng hai phía a

Ví dụ 1, trả sử tôi mong muốn lấy địa chỉ của a<0><0>, tức là tôi truy vấn vào mảng một chiều đầu tiên, cùng truy cập tiếp theo sau vào thành phần đầu tiên trong mảng đó. Coi hình minh họa mặt dưới

*

Tôi sẽ sử dụng cú pháp: *(a + 0) + 0 để lấy showroom a<0><0>

#include int main() //khai bao mang 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9 ; //lay dia bỏ ra a<0><0> bang *(a + 0) + 0 printf("Dia chi cua a<0><0> la: %x", *(a + 0) + 0);

Dia đưa ra cua a<0><0> la: 62fdf0
Chú ý: Địa chỉ ô ghi nhớ trên mỗi máy tính khi thực hiện chương trình bên trên là khác nhau. Kết quả trên chỉ với minh họa

Ví dụ thứ 2 tôi hy vọng lấy add của a<2><1>, tức là tôi truy vấn vào mảng một chiều thứ 2, và truy cập tiếp theo sau vào thành phần thứ một trong những mảng đó.

*

Tôi sẽ thực hiện cú pháp: *(a + 2) + 1 nhằm lấy showroom a<2><1>

#include int main() //khai bao với 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9, ; //lay dia bỏ ra a<2><1> bang *(a + 2) + 1 printf("Dia bỏ ra cua a<2><1> la: %x", *(a + 2) + 1);

Dia chi cua a<2><1> la: 62fe0c
Chú ý: Địa chỉ ô nhớ trên mỗi máy tính xách tay khi triển khai chương trình bên trên là không giống nhau. Kết quả trên chỉ nên minh họa

→ Qua nhì ví dụ trên ta hoàn toàn có thể rút ra phương pháp cho showroom và quý hiếm của bộ phận a nào kia trong mảng 2 chiều

Công thức cho add ô lưu giữ a là: *(a+i)+jVà ta trọn vẹn lấy giá tốt trị của a bằng cách thêm toán tử * cho toàn cục công thức trên: *(*(a+i) + j)

Để minh họa về câu hỏi lấy cực hiếm của chúng ta cùng quay trở lại ví dụ 2, tôi sẽ lấy quý hiếm tại a<2><1> = 8

*

Theo cách làm *(*(a+2) + 1)

#include int main() //khai bao sở hữu 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9, ; //lay gia tri a<2><1> bang *(*(a+2) + 1) printf("Gia tri cua a<2><1> la: %d",*(*(a+2) + 1));

Gia tri cua a<2><1> la: 8
Như vậy, ta đã có công thức cho add ô nhớ và quý hiếm của thành phần a trong mảng hai chiều.

Tiếp theo ta sẽ vận dụng con trỏ để truy vấn vào add và giá trị của phần tử mảng a đó. Ta ghi nhớ lại rằng mảng một chiều khi làm việc với bé trỏ ta chỉ vấn đề gán nhỏ trỏ p. = a (trong đó a là tên mảng) bạn đọc quên rất có thể quay lại đọc Bài 2: bé trỏ làm việc với mảng một chiều trong C.

Luôn nhớ rằng, mảng nhì chiều thực chất cũng là mảng một chiều chứa nhiều thành phần và mỗi phần tử trong đó lại là một trong mảng một chiều gồm những cột.

Vì cầm cố để thực hiện con trỏ giữ trữ địa chỉ cửa hàng của mảng 2d đó ta buộc phải một bé trỏ mang lại một mảng có size bằng số cột của mảng 1 chiều.

Ví dụ dưới đây tôi có mảng a<3><3> (có 3 sản phẩm 3 cột) phải tôi sẽ khai báo như sau:

#include int main() //khai bao sở hữu 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9, ; //khoi tao con tro p. Tro den 3 cot int (*p)<3>; //gan bé tro p. Bang với a p. = a;Giả sử tôi có mảng a<3><4> (3 mặt hàng 4 cột) tôi vẫn khai báo: int (*p)<4>;

→ bởi vậy ta bao gồm công thức để hoàn toàn có thể gán con trỏ đến mảng 2 chiều có form size a là: int (*p)

Bây giờ, ta trả toàn rất có thể sử dụng con trỏ để mang giá trị và add của các bộ phận trong mảng a bằng cách:

(p + i) để mang ra add của các bộ phận trong mảng nhì chiều* ( * ( phường + i) + j ) để kéo ra giá trị của các bộ phận trong mảng

Ví dụ dưới đây tôi sẽ áp dụng con trỏ (*p)<3> để lấy giá trị và showroom của mảng a<3><3>

#include int main(){ //khai bao có 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9, ; //khoi tao con tro p int (*p)<3>; //gan con tro p bang mang a p. = a; //duyet cac hang trong mang for(int i = 0; i

Dia đưa ra phan tu 0 la: 62fde0

Gia tri: a<0><0> =1

Gia tri: a<0><1> =2

Gia tri: a<0><2> =3

Dia bỏ ra phan tu 1 la: 62fdec

Gia tri: a<1><0> =4

Gia tri: a<1><1> =5

Gia tri: a<1><2> =6

Dia đưa ra phan tu 2 la: 62fdf8

Gia tri: a<2><0> =7

Gia tri: a<2><1> =8

Gia tri: a<2><2> =9

Ví dụ 2 tôi thực hiện con trỏ (*p)<3> để mang giá trị các phần tử là số chẵn gồm trong mảng a

#include int main(){ //khai bao mang 2 chieu a gom 3 x 3 phan tu int a<3><3> = 1,2,3, 4,5,6, 7,8,9, ; //khoi tao bé tro p cho mang a<3><3> int (*p)<3>; //gan bé tro p. Bang sở hữu a p = a; printf("Cac phan tu trong sở hữu la so chan "); //duyet cac hang trong với for(int i = 0; i

Cac phan tu trong có la so chan

Bài viết liên quan