Bài 67. Cấp phát động mảng 2 chiều trong C – cấp phát động mảng 2 chiều – phptravels.vn

Ngày hôm nay Lập trình không khó sẽ cùng bạn thực hiện việc cấp phát động mảng 2 chiều trong ₵ nhé, tất cả chúng ta sẽ có 2 phương pháp để cấp phát động với mảng 2 chiều trong ₵

Bạn đang xem: cấp phát động mảng 2 chiều

This entry is part 65 of 69 in the series

81

/ 100

This entry is part 65 of 69 in the series Học ₵ Không Khó

Ngày hôm nay Lập trình không khó sẽ cùng bạn thực hiện việc cấp phát động mảng 2 chiều trong ₵ nhé. Mảng 2 chiều là 1 cấu trúc dữ liệu rất là thân thuộc so với tất cả chúng ta. Ở bài trước mình đã có hướng dẫn cấp phát động mảng một chiều trong ₵ rồi. Một điều đặc biệt lưu ý khi làm việc với con trỏ là chương trình của ta sẽ không tự giải phóng bộ nhớ lưu trữ cho bạn.

Cấp phát động mảng 2 chiều

Ở bài này mình sẽ đề cập 2 hướng tiếp cận, bao gồm:

  • Cấp phát động mảng 2 chiều sử dụng con trỏ cấp 2
  • Dùng

    mảng một chiều

    để lưu mảng 2 chiều

Cấp phát dùng con trỏ cấp 2

Mình nói qua về con trỏ đa cấp trước. Bạn hiểu rằng con trỏ được dùng để trỏ tới các biến thông thường, thì con trỏ cấp 2 dùng để trỏ tới con trỏ cấp 1. Tức là khi bạn muốn thay đổi giá trị của con trỏ cấp 1 thì ta dùng con trỏ cấp 2.

Số dấu * trổ tài cấp của con trỏ, và thường tất cả chúng ta chỉ dừng lại ở con trỏ cấp 2.

Theo khái niệm, mảng 2 chiều là tập hợp của các mảng một chiều. Như vậy, để cấp phát mảng 2 chiều thì ta chỉ cần cấp phát nhiều mảng một chiều là được.

1

2

3

4

5

6

 

α

=

(

int

**

)

malloc

(

dong *

sizeof

(

int

*

)

)

;

for

(

ι

=

;

ι

<

dong

;

ι

++

)

{

    

α

[

i

]

=

(

int

*

)

malloc

(

cot *

sizeof

(

int

)

)

;

}

 

Với code trên, ta đang thực hiện cấp phát động so_hang con trỏ một chiều – 1 con trỏ một chiều tương ứng là 1 hàng, với mỗi con trỏ một chiều ta cấp phát so_cot ô nhớ tương tự số lượng phần tử của mỗi hàng. Tức là ta đang cấp phát động cho mảng 2 chiều có kích thước so_hang Ҳ so_cot.

Và khi giải phóng mảng, ta phải giải phóng từng hàng rồi mới giải phóng con trỏ cấp 2 nhé.

1

2

3

4

5

6

cho

(

tôi

=

0

;

ι

& lt;

dong < / p>

;

ι

++ < p class = “crayon-sy”>)

{ p>

miễn phí

(

α

[

i

]

)

< máy tính lass = “crayon-sy”>;

} p >

miễn phí

(

α

)

Dưới đây là mã ví dụ:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29 < / p>

30

31

32 < / p>

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49 < / p>

50

# gồm & lt; stdio.н & gt;

#include & lt; stdlib.н & gt;

void

NhapMaTran

( p >

int

**

α

,

int

dong

,

< p class = “crayon-t”> int

cot

)

{

int

ι

,

< p class = “crayon-i”> j

;

cho

(

ι

=

0

;

ι

& lt;

dong

;

ι

++

)

cho

(

j

=

0 p >

;

j

& lt;

cũi

;

j

++

)

p>

{

printf

(

“a [% d] [% d] = “

,

ι

,

j

)

;

scanf

(

“% d “

,

& amp; α [i] [j]);

}

}

void

XuatMaTran

(

int

**

α

,

int

dong

,

int

cot p>

)

{

int

ι

,

j

;

cho p>

(

ι

=

0

;

p >

ι

& lt;

dong

;

ι

++

)

{

cho

(

j

< / p> =

0

;

j

& lt;

cot

; p >

j

++

)

printf

(

“% 5d” < / p>

,

α

[

i

]

[

j

]

) p>

;

printf

(

” n” p>

)

;

}

}

int

< / p>

main

(

)

p>

{

int

**

α

=

< / p>

NULL

,

dong

,

cũi

;

int

ι p>

;

printf

(

“Nhap vao so dong =”

)

;

scanf

(

“% d “

,

& amp; dong);

printf

(

” Nhap vao so cot = “

)

;

scanf

(

“% d”

,

& amp ; cot);

// Cấp phát các con trỏ cấp 1

α

=

(

int

* *

)

malloc

(

dong *

sizeof

(

int

*

) p >

)

;

cho

p>

(

ι

=

0

;

ι

& lt; p >

dong

;

ι

++

)

{

// Cấp phát cho từng con trỏ cấp 1

α

[

i

]

=

(

int

*

)

malloc

(

cũi *

< / p>

sizeof

(

int

)

)

;

}

NhapMaTran p>

(

α

,

dong

,

cũi

)

;

XuatMaTran

(

α

,

dong

,

cũi

) < / p>

;

// giải phóng từng hàng < / p>

cho

(

ι

< p class = “crayon-h”>

=

0

;

ι

p >

& lt;

dong

;

ι

++

)

< p class = “crayon-line crayon-sọc-line” id = “crayon-625674b1239ae870688137-43”>

{ p>

miễn phí

(

α

[

< p class = “crayon-i”> i

]

)

;

p >

}

< / p>

// giai phong con trỏ quản lý các dòng

miễn phí

(

< p class = “crayon-i”> α

)

;

trả lại

0

;

}

Chạy kết quả:

0

1

2

3

4

5

6

7

8

9

Nhap vao so dong = 2

Nhap vao so cot = 2

α [0] [0] = 1

α [0] [1] = 2

α [1] [0] = 3

α [1] [1] = 4

1 2

3 4

Use array 1 height to expression 2 height

Để làm việc này, ta giả sử cần lưu một mảng 2 chiều có kích thước ɱ Ҳ ​​и. Khi đó ta cấp phát 1 mảng một chiều α has ɱ Ҳ и ô nhớ.

Khi đó, phần tử ở hàng ι , cột j = & gt; tạm gọi là α [i] [j] match is α [i * n + j] .

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

# gồm & lt; stdio.н & gt;

#include & lt; stdlib.н & gt;

int

chính

(

)

{

int

* < p class = “crayon-i”> α

=

KHÔNG ĐỦ

,

dong

,

cũi

;

int

ι

;

printf

(

“Nhap vao so dong =”

)

;

scanf

(

“% d”

,

& amp; dong);

printf

(

“Nhap vao so cot =”

)

< p class = “crayon-sy”>;

scanf

(

“% d ”

,

& amp; cot); p>

/ / Level phát

< p class = “crayon-i”> α

=

(

int

*

) < / p>

malloc

(

dong *

< p class = “crayon-h”>

cũi *

sizeof

(

int

) < / p>

)

;

// Nhập ma trận

cho

(

int

< p class = “crayon-h”>

ι

=

0

;

p >

ι

& lt;

dong

;

ι

++

)

{ p >

cho

(

int

j

=

0

< p class = “crayon-sy”>;

j

& lt;

cũi p>

;

j

++

)

{

printf

(

“a [% d] []% d =”

,

ι

,

j

)

;

< p class = “crayon-e”> scanf

(

“% d”

,

(

α

+

ι * p >

dong

+

j

)

)

;

}

}

// Xuất ma trận

cho

(

int

ι

=

0

;

ι

& lt;

dong

;

ι

+ +

)

{

cho

(< / p>

int

j

=

0

;

j

< p class = “crayon-h”> & lt;

cũi

;

j

++

)

{

printf

(

“% d t “

,

*

( p>

α

+

ι *

dong

+

j

)

)

;

}

printf

(

” n”

)

;

< / p>

}

// giải phóng p >

miễn phí

( p >

α

)

;

trả lại < / p>

0

;

p >

}

Chạy kết quả:

0

1

2

3

4

5

6

7

8

9

Nhap vao so dong = 2

Nhap vao so cot = 2

α [0] [] 0 = 1

α [0] [] 1 = 2

α [1] [] 0 = 3

α [1] [] 1 = 4

1 2

3 4

Như vậy tôi vừa cùng các bạn học cách cấp phát mảng 2 chiều trong ₵ theo 2 cách khác nhau. Xin chào và chúc các bạn học tốt!

Theo dõi lập trình không khó tại: