Sao chép mảng trong C | Laptrinhcanban.com

HOME › >>

Sao chép mảng trong C

Trong chương trình C, có đôi lúc chúng ta muốn sao chép nội dung của một mảng vào một mảng khác. Nếu trong các ngôn ngữ lập trình khác, chúng ta có thể đơn giản sử dụng toán tử bằng = để gán một mảng vào mảng khác theo kiểu arrayA = arrayB, thì chúng ta lại không thể làm điều đó trong C được. Thay vào đó thì chúng ta có 2 phương pháp sao chép mảng trong C là sao chép từng phần tử của mảng, hoặc là sử dụng hàm có sẵn là memcpy() trng thư viện chuẩn của C.

Sao chép từng phần tử của mảng trong C

Đây là cách copy mảng trong C đơn giản và dễ hiểu nhất. Chúng ta tạo một mảng mới, sau đó sử dụng vòng lặp for để lấy và sao chép từng phần tử trong mảng cũ và gán vào mảng mới với index tương đương.

Cụ thể chúng ta viết chương trình sao chép mảng trong C như sau:

#include <stdio.h>

int main(void){
/*Khởi tạo chuỗi ban đầu*/
short data1[10] = {5,7,2,8,1,0,3,9,6,4};

/*Khai báo chuỗi kết quả có cùng độ dài*/
short data2[10];

/*Tạo vòng lặp, lấy và copy từng phần tử từ mảng cũ và gán vào mảng mới */
for (short i = 0; i < 10; i++) {
data2[i] = data1[i];
}


/*Kiểm tra mảng mới*/
for(short i = 0; i < 10; i++) {
printf("%d ", data2[i]);
}
}
//> 5 7 2 8 1 0 3 9 6 4

Bạn có thể thấy mảng cũ đã được copy sang mảng mới với các giá trị giống nhau rồi phải không nào.

Tương tự, chúng ta cũng có thể sao chép mảng mảng hai chiều trong C với phương pháp trên. Ví dụ:

##include <stdio.h>
int main(void){
/*Khởi tạo chuỗi ban đầu*/
short data1[2][10] = {{5,7,2,8,1,0,3,9,6,4}, {-5,-7,-2,-8,-1,0,-3,-9,-6,-4}};

/*Khai báo chuỗi kết quả có cùng độ dài*/
short data2[2][10];

/*Tạo vòng lặp, lấy và copy từng phần tử từ mảng cũ và gán vào mảng mới */
short i, j;
for (i = 0; i < 2; i++){
for (j = 0; j < 10; j++) {
data2[i][j] = data1[i][j];
}
}

/*Kiểm tra mảng mới*/
for (i = 0; i < 2; i++){
for (j = 0; j < 10; j++) {
printf("%d ",data2[i][j]);
}
printf("\n");
}
}
// 5 7 2 8 1 0 3 9 6 4
// -5 -7 -2 -8 -1 0 -3 -9 -6 -4

Lại nữa, để tiện sử dụng thì chúng ta cũng có thể tạo một hàm sao chép mảng trong C như sau:

#include <stdio.h>
short array_copy(short* array1, short* array2, short size)
{
short i;
/*Nếu chuỗi ban đầu hoặc chuỗi kết quả là Null, kết thúc hàm và trả về 0 */
if ((array1 == NULL) ||
(array2 == NULL) ||
(size <= 0 ) ) {
return 0;
}

/*Tạo vòng lặp, lấy và copy từng phần tử từ mảng cũ và gán vào mảng mới */
for (i = 0; i < size; i++) {
array1[i] = array2[i];
}

/*Kiểm tra mảng mới*/
for(short i = 0; i < size; i++) {
printf("%d ", array2[i]);
}

return 1;
}

int main(void){
short data1[10] = {5,7,2,8,1,0,3,9,6,4};
short data2[10];

array_copy(data2, data1, 10);
}
//> 5 7 2 8 1 0 3 9 6 4

Sao chép mảng trong C | hàm memcpy

Ở phần trên chúng ta đã tự tạo ra một hàm sao chép mảng trong C bằng vòng lặp for. Tuy nhiên thì trong C cũng đã chuẩn bị sẵn một số hàm trong thư viện chuẩn để giúp chúng ta sao chép mảng trong C, và một trong số đó là hàm memcpy().

Hàm memcpy() là một hàm có sẵn trong header file string.h, giúp chúng ta copy bộ nhớ trong máy tính. Ứng dụng hàm memcpy vào việc copy mảng, thì thay vì copy mảng chúng ta sẽ copy vùng bộ nhớ chứa mảng ban đầu sang một vùng khác chứa mảng kết quả.

Ôn lại một chút thì hàm memcpy() có cấu trúc như sau:

memcpy (dest_address, src_address, size);

Trong đó dest_address là con trỏ chỉ vị trí đầu vùng bộ nhớ đích, src_address là con trỏ chỉ vị trí đầu vùng bộ nhớ nguồn, và size là kích thước cần copy. Ở đây, dest là viết tắt của destination có nghĩa là điểm đến, còn str là viết tắt của source có nghĩa là nguồn.

Ứng dụng trong trường hợp muốn sao chép mảng trong C bằng hàm memcpy thì chúng ta có cú pháp sau đây:

memcpy((void *)dest, (void *)src, sizeof(src));

Trong đó (void *)dest là con trỏ chỉ địa chỉ vị trí đầu bộ nhớ chuỗi đích dest, (void *)src là con trỏ chỉ chỉ vị trí đầu bộ nhớ chuỗi src nguồn, và sizeof(src)) là kích thước dữ liệu cần copy từ bộ nhớ chuỗi nguồn src.

Ví dụ cụ thể:

#include <stdio.h>
#include <string.h>


int main(void)
{
short src[10] = {5,7,2,8,1,0,3,9,6,4};
short dest[10];

/*Sao chép mảng trong C bằng hàm memcpy*/
memcpy((void *)dest, (void *)src, sizeof(src));

/*Kiểm tra mảng mới*/
for(short i = 0; i < 10; i++) {
printf("%d ", dest[i]);
}
}
//> 5 7 2 8 1 0 3 9 6 4

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn cách sao chép mảng trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

URL Link

https://laptrinhcanban.com/c/lap-trinh-c-co-ban/mang-trong-c/sao-chep-mang-trong-c/

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME  › >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.