Mảng 2 chiều trong c

     

Một mảng nhị chiều là một mảng đựng nhiều mảng một chiều, nhiều khi mảng hai chiều còn được ngầm gọi như một bảng bao hàm các mặt hàng và các cột. Mảng hai phía còn thường xuyên được call với cái tên 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 cập vào hàng sản phẩm i cột thiết bị j gồm trong mảng. Lấy một ví dụ mảng a<1><3> (nghĩa là: i = 1, j = 3)

Ví dụ tiếp sau đây tôi gồm a là mảng 2 chiều (hay nói một cách khác là ma trận) có kích cỡ 3 x 3 như sau:

#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 ;Chúng ta rất có thể tưởng tượng mảng hai chiều trên như 1 bảng như sau:

*

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

*

Dòng trên cùng là số lượng các hàng, vì bọn họ có mảng 2 chiều kích thước 3 x 3 nên có 3 hàng (3 row). Trong mỗi hàng được gom team lại 3 phần tử tương ứng cùng với 3 cột.

Dòng ở giữa là giá trị của mỗi thành phần ở hàng đồ vật i cột vật dụng j, 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 sau cuối là add của mỗi thành phần ở hàng máy i cột máy j, ví dụ như a<1><1> lưu trữ tại showroom 1000, a<1><2> lưu trữ tại add 1004, a<1><3> tàng trữ tại showroom 1008… với a<3><3> lưu trữ tại add 1032

Vì đấy là mảng bao gồm kiểu int cùng có kích cỡ 4 byte đề xuất mỗi địa chỉ liền kề phương pháp nhau 4 đơn vị chức năng (4 byte).

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

2.Sử dụng bé trỏ để làm việc với các bộ phận trong mảng nhì chiều

2.1 Địa chỉ ô ghi nhớ của các bộ phận mảng nhị chiều

Mảng hai chiều rất có thể được có mang như là một trong những con trỏ trỏ tới một tổ các mảng một chiều liên tiếp nhau.

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

Xem thêm: Hướng Dẫn Cách Làm Cơm Chiên Tỏi Trứng Giòn Ngon Nhất Tại Nhà

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

*

Như vậy tất cả nghĩa là:

(a + 0) trỏ đến mảng sản phẩm 0(a + 1) trỏ đến mảng sản phẩm công nghệ 1(a + 2) trỏ mang đến mảng máy 2

*

Tóm lại, ta rất có thể hiểu (a + i) trỏ mang đến mảng một chiều đồ vật i trong mảng 2 chiều.

Tuy nhiên, vào mảng vật dụng i lại mãi mãi thêm những giá trị ở trong những số đó (vì mảng thiết bị i này là mảng 1 chiều). Lấy ví dụ (a + 0) thì đang là:

*

Hay (a + 1) thì sẽ là:

*

Hoặc (a + 2) thì sẽ là:

*

Chú ý: Địa chỉ ô ghi nhớ trên chỉ nên ví dụ để ta dễ dàng hình dung.

2.2 thực hiện con trỏ nhằm truy cập showroom và giá trị của bộ phận mảng nhị chiều

Bạn đọc hãy cùng tôi tham khảo hai ví dụ tiếp sau đây để đúc kết công thức bao quát cho câu hỏi lấy add và quý hiếm của mảng hai phía a

Ví dụ 1, giả sử tôi ý muốn lấy địa chỉ cửa hàng của a<0><0>, nghĩa là tôi truy cập vào mảng 1 chiều đầu tiên, và truy cập tiếp theo vào phần tử đầu tiên vào mảng đó. Xem hình minh họa bên dưới

*

Tôi sẽ áp dụng cú pháp: *(a + 0) + 0 nhằm lấy địa chỉ a<0><0>

#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 đưa ra a<0><0> bang *(a + 0) + 0 printf("Dia bỏ ra cua a<0><0> la: %x", *(a + 0) + 0);

Dia chi cua a<0><0> la: 62fdf0
Chú ý: Địa chỉ ô lưu giữ trên mỗi laptop khi tiến hành chương trình bên trên là khác nhau. Kết quả trên chỉ nên minh họa

Ví dụ thứ 2 tôi mong mỏi lấy showroom của a<2><1>, nghĩa là tôi truy vấn vào mảng 1 chiều thứ 2, với truy cập tiếp sau vào phần tử thứ một trong mảng đó.

*

Tôi sẽ áp dụng cú pháp: *(a + 2) + 1 để lấy địa chỉ cửa hàng a<2><1>

#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<2><1> bang *(a + 2) + 1 printf("Dia chi cua a<2><1> la: %x", *(a + 2) + 1);

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

→ Qua hai ví dụ bên trên ta hoàn toàn có thể rút ra phương pháp cho add và quý giá của phần tử a nào đó trong mảng 2 chiều

Công thức cho showroom ô ghi nhớ a là: *(a+i)+jVà ta trọn vẹn lấy được giá trị của a bằng phương pháp thêm toán tử * cho toàn thể công thức trên: *(*(a+i) + j)

Để minh họa về bài toán lấy quý giá của họ cùng trở lại ví dụ 2, tôi sẽ lấy cực hiếm tại a<2><1> = 8

*

Theo bí quyết *(*(a+2) + 1)

#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, ; //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 đã gồm công thức cho add ô lưu giữ và giá trị của phần tử a vào mảng nhì chiều.

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

Luôn ghi nhớ rằng, mảng nhì chiều thực chất cũng là mảng 1 chiều chứa nhiều bộ phận và mỗi thành phần trong kia lại là 1 mảng một chiều gồm các cột.

Xem thêm: Uống Nước Củ Sen Có Tác Dụng Gì, Công Dụng Của Củ Sen Trong Việc Chữa Bệnh

Vì rứa để thực hiện con trỏ lưu giữ trữ add của mảng 2 chiều đó ta yêu cầu một bé trỏ đến một mảng có kích thước bằng số cột của mảng 1 chiều.

Ví dụ sau đây tôi bao gồm mảng a<3><3> (có 3 sản phẩm 3 cột) yêu cầu tôi đã khai báo 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, ; //khoi tao bé tro p tro den 3 cot int (*p)<3>; //gan con tro phường bang có a phường = a;Giả sử tôi có mảng a<3><4> (3 sản phẩm 4 cột) tôi đã khai báo: int (*p)<4>;

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

Bây giờ, ta trả toàn hoàn toàn có thể sử dụng nhỏ trỏ để lấy giá trị và showroom của các phần tử trong mảng a bằng cách:

(p + i) để lấy ra showroom của các phần tử trong mảng hai chiều* ( * ( p. + i) + j ) để kéo ra giá trị của các bộ phận trong mảng

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

#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 bé tro p int (*p)<3>; //gan nhỏ tro p bang có a p = a; //duyet cac hang trong với for(int i = 0; i

Dia bỏ 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 đưa 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 chi 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 áp dụng con trỏ (*p)<3> để đưa giá trị các bộ phận là số chẵn tất cả trong mảng a

#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, ; //khoi tao bé tro phường cho mang a<3><3> int (*p)<3>; //gan con tro phường bang sở hữu a p = a; printf("Cac phan tu trong với la so chan "); //duyet cac hang trong có for(int i = 0; i

Cac phan tu trong có la so chan

kimsa88
cf68