Khai báo mảng trong C chi tiết

By 03/07/2021Tháng Bảy 7th, 2021C/C++, KIẾN THỨC LẬP TRÌNH

Trong bài viết này, bạn sẽ được tìm hiểu về cách làm việc với các mảng trong C (ngôn ngữ lập trình), cách khai báo, khởi tạo và truy cập vào từng phần tử của một mảng trong C thông qua các ví dụ.

mang trong c

1. Mảng trong C là gì?

Mảng trong C là một biến có thể lưu trữ nhiều giá trị. Ví dụ, nếu muốn lưu trữ 100 số nguyên, bạn có thể tạo một mảng để lưu trữ chúng.

int data[100];

1.1 Làm sao để khai báo mảng trong C?

dataType arrayName[arraySize];

Ví dụ,

float mark[5];

Trong ví dụ này, tôi đã khai báo mảng mark của kiểu floating-point. Và kích thước của nó là 5. Có nghĩa là, nó có thể chứa được 5 giá trị số thực.

Điều quan trọng nhất mà bạn cần lưu ý chính là bạn không thể thay đổi được kích thước và kiểu của một mảng sau khi đã khai báo xong.

1.2 Truy cập vào các phần tử của mảng

Bạn có thể truy cập vào các phần tử của mảng bằng các chỉ mục. Giả sử bạn đã khai báo mảng mark như trên. Phần tử đầu tiên chính là mark[0], phần tử thứ 2 chính là mark[1],…

Cụ thể là:

  • Các mảng có số 0 được xem là chỉ mục đầu tiên. Ví dụ mark[0] là phần tử đầu tiên
  • Nếu kích thước của một mảng là n, để truy cập vào phần từ cuối cùng, thì bạn cần sử dụng n-1 chỉ mục. Trong ví dụ này, chính là mark[4]
  • Giả sử địa chỉ bắt đầu của mark[0] là 2120d. Sau đó, địa chỉ của mark[1] sẽ là 2124d. Tương tự, địa chỉ của mark[2] sẽ là 2128d,…

Lưu ý, kích thước của một biến float là 4 byte.

1.3 Làm thế nào để khởi tạo một mảng trong C?

Bạn có thể khởi tạo một mảng trong quá trình khai báo. Ví dụ,

int mark[5] = {19, 10, 8, 17, 9};

Bạn có thể khởi tạo một mảng như sau

int mark[] = {19, 10, 8, 17, 9};

Trong ví dụ này, tôi chưa chỉ định kích thước cụ thể. Tuy nhiên, trình biên dịch sẽ biết được kích thước của mảng này là 5 vì tôi đang khởi tạo nó với 5 phần tử là

mark[0] is equal to 19

mark[1] is equal to 10

mark[2] is equal to 8

mark[3] is equal to 17

mark[4] is equal to 9

1.4 Thay đổi giá trị của các phần tử của mảng

int mark[5] = {19, 10, 8, 17, 9}

// make the value of the third element to -1

mark[2] = -1;

// make the value of the fifth element to 0

mark[4] = 0;

1.5 Đầu vào và đầu ra của các phần tử của mảng

Dưới đây là cách mà bạn có thể lấy dữ liệu mà người dùng nhập vào và lưu trữ nó trong một phần tử mảng.

// take input and store it in the 3rd element

​scanf(“%d”, &mark[2]);

// take input and store it in the ith element

scanf(“%d”, &mark[i-1]);

Còn dưới đây là cách mà bạn có thể in một phần tử riêng lẻ của một mảng.

// print the first element of the array

printf(“%d”, mark[0]);

// print the third element of the array

printf(“%d”, mark[2]);

// print ith element of the array

printf(“%d”, mark[i-1]);

Ví dụ 1: Đầu vào và đầu ra của mảng

// Program to take 5 values from the user and store them in an array

// Print the elements stored in the array

#include <stdio.h>

int main() {

int values[5];

printf(“Enter 5 integers: “);

// taking input and storing it in an array

for(int i = 0; i < 5; ++i) {

scanf(“%d”, &values[i]);

}

printf(“Displaying integers: “);

// printing elements of an array

for(int i = 0; i < 5; ++i) {

printf(“%d\n”, values[i]);

}

return 0;

}

Đầu ra

Enter 5 integers: 1

-3

34

0

3

Displaying integers: 1

-3

34

0

3

Trong ví dụ này, tôi đã sử dụng vòng lặp for để lấy 5 đầu vào do người dùng nhập và lưu trữ chúng trong cùng một mảng. Sau đó, tôi tiếp tục sử dụng một vòng lặp for khác, lúc này, các phần tử sẽ được hiển thị lên màn hình.

Ví dụ 2: Tính trung bình cộng

// Program to find the average of n numbers using arrays

#include <stdio.h>

int main()

{

int marks[10], i, n, sum = 0, average;

printf(“Enter number of elements: “);

scanf(“%d”, &n);

for(i=0; i<n; ++i)

{

printf(“Enter number%d: “,i+1);

scanf(“%d”, &marks[i]);

// adding integers entered by the user to the sum variable

sum += marks[i];

}

average = sum/n;

printf(“Average = %d”, average);

return 0;

}

Đầu ra

Enter n: 5

Enter number1: 45

Enter number2: 35

Enter number3: 38

Enter number4: 31

Enter number5: 49

Average = 39

Trong ví dụ này, tôi sẽ tính trung bình cộng của n số do người dùng nhập vào.

1.6 Truy cập vào các phần tử bên ngoài giới hạn

Giả sử bạn khai báo mảng trong C gồm 10 phần tử

int testArray[10];

Bạn có thể truy cập vào các phần từ mảng từ testArray[0] đến testArray[9].

Trường hợp nếu bạn cố gắng truy cập testArray[12], thì phần tử này không sẵn có. Điều này dẫn đến việc đầu ra mà bạn nhận được sẽ không đúng như mong đợi. Hoặc có thể lập trình sẽ bị lỗi, nhưng trong một số trường hợp, lập trình của bạn có thể chạy chính xác.

Do đó, bạn không nên truy cập vào các phần tử mảng nằm bên ngoài giới hạn.

2. Mảng đa chiều trong lập trình C

Trong phần này, bạn sẽ được học cách làm việc với mảng đa chiều (mảng hai hoặc ba chiều) thông qua các ví dụ.

Trong lập trình C, bạn có thể tạo một mảng bao gồm nhiều mảng. Những mảng này được gọi là mảng đa chiều. Ví dụ,

float x[3][4];

Trong ví dụ này, x là một mảng 2 chiều(2d). Mảng này chứa 12 phần tử. Mảng này giống như một bảng gồm 3 hàng và mỗi hàng có 4 cột.

Bạn cũng có thể khai báo một mảng ba chiều theo cách tương tự như trên. Ví dụ,

float y [2] [4] [3];

Ở đây, mảng y có thể chứa 24 phần tử.

2.1 Khởi tạo một mảng đa chiều

Dưới đây là cách để khởi tạo mảng hai chiều và mảng ba chiều:

Khởi tạo mảng 2 chiều

// Different ways to initialize two-dimensional array

int c[2][3] = {{1, 3, 0}, {-1, 5, 9}};

int c[][3] = {{1, 3, 0}, {-1, 5, 9}};

int c[2][3] = {1, 3, 0, -1, 5, 9};

Khởi tạo mảng 3 chiều

Bạn có thể khởi tạo mảng 3 chiều theo cách tương tự như khởi tạo mảng 2 chiều. Ví dụ,

int test[2][3][4] = {

{{3, 4, 2, 3}, {0, -3, 9, 11}, {23, 12, 23, 2}},

{{13, 4, 56, 3}, {5, 9, 3, 5}, {3, 1, 4, 9}}};

Ví dụ 1: mảng 2 chiều dùng để lưu trữ và in các giá trị

// C program to store temperature of two cities of a week and display it.

#include <stdio.h>

const int CITY = 2;

const int WEEK = 7;

int main()

{

int temperature[CITY][WEEK];

// Using nested loop to store values in a 2d array

for (int i = 0; i < CITY; ++i)

{

for (int j = 0; j < WEEK; ++j)

{

printf(“City %d, Day %d: “, i + 1, j + 1);

scanf(“%d”, &temperature[i][j]);

}

}

printf(“\nDisplaying values: \n\n”);

// Using nested loop to display vlues of a 2d array

for (int i = 0; i < CITY; ++i)

{

for (int j = 0; j < WEEK; ++j)

{

printf(“City %d, Day %d = %d\n”, i + 1, j + 1, temperature[i][j]);

}

}

return 0;

}

Đầu ra

City 1, Day 1: 33

City 1, Day 2: 34

City 1, Day 3: 35

City 1, Day 4: 33

City 1, Day 5: 32

City 1, Day 6: 31

City 1, Day 7: 30

City 2, Day 1: 23

City 2, Day 2: 22

City 2, Day 3: 21

City 2, Day 4: 24

City 2, Day 5: 22

City 2, Day 6: 25

City 2, Day 7: 26

Hiển thị giá trị:

City 1, Day 1 = 33

City 1, Day 2 = 34

City 1, Day 3 = 35

City 1, Day 4 = 33

City 1, Day 5 = 32

City 1, Day 6 = 31

City 1, Day 7 = 30

City 2, Day 1 = 23

City 2, Day 2 = 22

City 2, Day 3 = 21

City 2, Day 4 = 24

City 2, Day 5 = 22

City 2, Day 6 = 25

City 2, Day 7 = 26

Ví dụ 2: Tổng của 2 ma trận

// C program to find the sum of two matrices of order 2*2

#include <stdio.h>

int main()

{

float a[2][2], b[2][2], result[2][2];

// Taking input using nested for loop

printf(“Enter elements of 1st matrix\n”);

for (int i = 0; i < 2; ++i)

for (int j = 0; j < 2; ++j)

{

printf(“Enter a%d%d: “, i + 1, j + 1);

scanf(“%f”, &a[i][j]);

}

// Taking input using nested for loop

printf(“Enter elements of 2nd matrix\n”);

for (int i = 0; i < 2; ++i)

for (int j = 0; j < 2; ++j)

{

printf(“Enter b%d%d: “, i + 1, j + 1);

scanf(“%f”, &b[i][j]);

}

// adding corresponding elements of two arrays

for (int i = 0; i < 2; ++i)

for (int j = 0; j < 2; ++j)

{

result[i][j] = a[i][j] + b[i][j];

}

// Displaying the sum

printf(“\nSum Of Matrix:”);

for (int i = 0; i < 2; ++i)

for (int j = 0; j < 2; ++j)

{

printf(“%.1f\t”, result[i][j]);

if (j == 1)

printf(“\n”);

}

return 0;

}

Đầu ra

Enter elements of 1st matrix

Enter a11: 2;

Enter a12: 0.5;

Enter a21: -1.1;

Enter a22: 2;

Enter elements of 2nd matrix

Enter b11: 0.2;

Enter b12: 0;

Enter b21: 0.23;

Enter b22: 23;

Sum Of Matrix:

2.2 0.5

-0.9 25.0

Ví dụ 3: Mảng ba chiều

// C Program to store and print 12 values entered by the user

#include <stdio.h>

int main()

{

int test[2][3][2];

printf(“Enter 12 values: \n”);

for (int i = 0; i < 2; ++i)

{

for (int j = 0; j < 3; ++j)

{

for (int k = 0; k < 2; ++k)

{

scanf(“%d”, &test[i][j][k]);

}

}

}

// Printing values with proper index.

printf(“\nDisplaying values:\n”);

for (int i = 0; i < 2; ++i)

{

for (int j = 0; j < 3; ++j)

{

for (int k = 0; k < 2; ++k)

{

printf(“test[%d][%d][%d] = %d\n”, i, j, k, test[i][j][k]);

}

}

}

return 0;

}

Đầu ra

Enter 12 values:

1

2

3

4

5

6

7

8

9

10

11

12

Hiển thị các giá trị:

test[0][0][0] = 1

test[0][0][1] = 2

test[0][1][0] = 3

test[0][1][1] = 4

test[0][2][0] = 5

test[0][2][1] = 6

test[1][0][0] = 7

test[1][0][1] = 8

test[1][1][0] = 9

test[1][1][1] = 10

test[1][2][0] = 11

test[1][2][1] = 12

3. Hàm và mảng trong C

3.1 Truyền các mảng vào hàm trong lập trình C

Trong phần này, bạn sẽ được học cách truyền các mảng (cả mảng một chiều và mảng đa chiều) vào hàm trong lập trình C thông qua các ví dụ.

Trong lập trình C, bạn có thể truyền toàn bộ mảng vào các hàm. Trước tiên, tôi sẽ giới thiệu cho bạn về cách để truyền các phần tử riêng lẻ của một mảng vào các hàm.

Truyền các phần tử mảng riêng lẻ

Truyền các phần tử mảng vào hàm tương tự như truyền các biến vào hàm.

Ví dụ 1: Truyền một mảng

#include <stdio.h>

void display(int age1, int age2)

{

printf(“%d\n”, age1);

printf(“%d\n”, age2);

}

int main()

{

int ageArray[] = {2, 8, 4, 12};

// Passing second and third elements to display()

display(ageArray[1], ageArray[2]);

return 0;

}

Đầu ra

8

4

Ví dụ 2: Truyền nhiều mảng cho nhiều hàm

// Program to calculate the sum of array elements by passing to a function

#include <stdio.h>

float calculateSum(float age[]);

int main() {

float result, age[] = {23.4, 55, 22.6, 3, 40.5, 18};

// age array is passed to calculateSum()

result = calculateSum(age);

printf(“Result = %.2f”, result);

return 0;

}

float calculateSum(float age[]) {

float sum = 0.0;

for (int i = 0; i < 6; ++i) {

sum += age[i];

}

return sum;

}

Đầu ra

Result = 162.50

Để truyền toàn bộ mảng cho một hàm thì bạn chỉ cần truyền tên của mảng dưới dạng đối số là được.

result =  calculateSum(age);

Tuy nhiên, cần lưu ý việc sử dụng dấu [] trong định nghĩa hàm.

float calculateSum(float age[]) {

… ..

}

Việc này nhằm thông báo cho trình biên dịch rằng bạn đã truyền mảng một chiều vào hàm này.

Truyền mảng đa chiều vào một hàm

Để truyền mảng đa chiều vào một hàm, bạn chỉ cần truyền tên của mảng vào hàm là được (tương tự như mảng một chiều).

Ví dụ 3: Truyền các mảng hai chiều

#include <stdio.h>

void displayNumbers(int num[2][2]);

int main()

{

int num[2][2];

printf(“Enter 4 numbers:\n”);

for (int i = 0; i < 2; ++i)

for (int j = 0; j < 2; ++j)

scanf(“%d”, &num[i][j]);

// passing multi-dimensional array to a function

displayNumbers(num);

return 0;

}

void displayNumbers(int num[2][2])

{

printf(“Displaying:\n”);

for (int i = 0; i < 2; ++i) {

for (int j = 0; j < 2; ++j) {

printf(“%d\n”, num[i][j]);

}

}

}

Đầu ra

Enter 4 numbers:

2

3

4

5

Hiển thị:

2

3

4

5

Lưu ý, bạn có thể truyền các mảng trong C vào các hàm. Tuy nhiên, bạn không thể di chuyển các mảng về lại chỗ cũ sau khi đã truyền chúng vào các hàm.

Để lại một câu trả lời