– Trong nội dung của bài viết này, mình sẽ trình bày cách dùng con trỏ thao tác với mảng 1 chiều trong lập trình C.
Nội dung gồm các phần như sau:
- Nhập, xuất mảng các số nguyên
- Thêm một phần tử vào mảng
- Xóa một phần tử khỏi mảng
- Hàm main thực hiện chương trình
– Vì bài viết có liên quan đến kiến thức của các phần bên dưới nên các bạn có thể xem lại nếu cần nhé:
- Con trỏ là gì? Có ăn được không?
- Cấp phát và giải phóng bộ nhớ trong lập trình C
- Mảng 1 chiều trong lập trình C
- Mối liên hệ giữa con trỏ và mảng 1 chiều
- Hàm và cách sử dụng trong lập trình C/C++
- Tham trị, tham chiếu trong lập trình C/C++
– Ở bài viết các kỹ thuật trên mảng 1 chiều (không sử dụng con trỏ) đã giải thích chi tiết các kỹ thuật thao tác với mảng một chiều rồi nên bài viết này mình chỉ tập trung vào cách sử dụng con trỏ thao tác với mảng một chiều thôi.
1. Nhập, xuất mảng các số nguyên
void NhapMang(int *a, int n)
{
for (int ii = 0; ii < n; ii++)
{
printf("\nNhap vao a[%d] = ", ii);
scanf_s("%d", &a[ii]);
}
}
// Hàm xuất mảng
void XuatMang(int *a, int n)
{
for (int ii = 0; ii < n; ii++)
{
printf("%4d", a[ii]);
}
}
[/code]
2. Thêm một phần tử vào mảng
void ThemPhanTu(int *a, int *n, int PhanTuThem, int ViTriThem)
{
// Gia tăng bộ nhớ thêm 1 ô trước khi thêm phần tử
// (Khi dùng realloc thì truyền a, nó sẽ hiểu là truyền tham chiếu)
realloc(a, ((*n) + 1) * sizeof(int *));
for (int ii = (*n); ii >= ViTriThem + 1; ii–)
{
//SAU = TRƯỚC
a[ii] = a[ii – 1];
}
// Tăng số lượng phần tử của mảng a
(*n)++;
a[ViTriThem] = PhanTuThem;
}
[/code]
3. Xóa một phần tử khỏi mảng
void XoaPhanTu(int a[], int *n, int ViTriXoa)
{
for (int ii = ViTriXoa + 1; ii <= (*n) – 1; ii++)
{
//SAU = TRƯỚC
a[ii – 1] = a[ii];
}
// Giảm số lượng phần tử của mảng a
(*n)–;
// Giảm bộ nhớ đi 1 ô (vì trên đã n– rồi nên sẽ realloc với n)
realloc(a, (*n) * sizeof(int *));
}
[/code]
4. Hàm main thực hiện chương trình
#include <stdlib.h>
// Đặt hàm cần thực hiện chức năng cụ thể vào đây.
int main()
{
// Khai báo số lượng phần tử của mảng
int n;
// Nhập số phần tử của mảng và kiểm tra tính hợp lệ
do {
printf( "\nNhap so luong phan tu cua mang: " );
scanf_s( "%d", &n );
if (n <= 0) {
printf( "So luong phan tu cua mang khong hop le." );
}
} while ( n <= 0 );
// Khai báo con trỏ và cấp phát bộ nhớ
int *a = (int *)malloc(n * sizeof(int *));
// Nhập
NhapMang( a, n );
// Xuất
printf( "\nMang vua nhap la: " );
XuatMang( a, n );
// Thêm phần tử (Vị trí thêm hợp lệ: 0 -> n)
int ViTriThem, PhanTuThem;
do {
printf( "\nNhap vi tri them (0 -> %d): ", n );
scanf_s( "%d", &ViTriThem );
if ( ViTriThem < 0 || ViTriThem > n )
{
printf( "\nVi tri them khong hop le (0 -> %d).", n );
}
} while ( ViTriThem < 0 || ViTriThem > n );
printf( "Nhap phan tu them: " );
scanf_s( "%d", &PhanTuThem );
ThemPhanTu( a, &n, PhanTuThem, ViTriThem );
printf( "Mang sau khi them phan tu %d vao vi tri %d la: ", PhanTuThem, ViTriThem );
XuatMang( a, n );
// Xóa phần tử ( Vị trí xóa hợp lệ: 0 -> n – 1 )
int ViTriXoa;
do {
printf( "\nNhap vi tri xoa (0 -> %d): ", n – 1 );
scanf_s( "%d", &ViTriXoa );
if ( ViTriXoa < 0 || ViTriXoa > (n – 1) )
{
printf( "\nVi tri xoa khong hop le (0 -> %d).", n – 1 );
}
} while ( ViTriXoa < 0 || ViTriXoa > (n – 1) );
XoaPhanTu( a, &n, ViTriXoa );
printf( "Mang sau khi xoa phan tu tai vi tri %d la: ", ViTriXoa );
XuatMang( a, n );
// Giải phóng vùng nhớ
free( a );
getch();
return 0;
}
[/code]