[C/C++] Sử dụng con trỏ cấp phát động cho mảng

     Con trỏ là biến đặc biệt, biến này được sử dụng để lưu địa chỉ của biến mà nó trỏ đến. Với cách trỏ như vậy, con trỏ có thể thay đổi một biến khác mà không cần phải thao tác trực tiếp bằng tên của biến đó.

     Một ứng dụng khá quan trọng của con trỏ là có thể cấp phát bộ nhớ cho mảng, sử dụng cách cấp phát này chúng ta có thể tiết kiệm bộ nhớ rất đáng kể. Vì chỉ khi bạn cần bao nhiêu phần tử thì chương trình sẽ tự động cấp cho bạn bấy nhiêu ô nhớ để sử dụng. Và sau khi sử dụng xong, bạn có thể giải phóng bộ nhớ này để chương trình có thể sử dụng lại cho nhiệm vụ khác. 

 Để cấp phát động bộ nhớ cho đối tượng ta có thể sử dụng một trong các cách sau:

1.  Đối với ngôn ngữ C

  <tên con trỏ>=(kiểu dữ liệu *) calloc (tổng số phần tử, sizeof(kiểu dữ liệu));

  <tên con trỏ>=(kiểu dữ liệu *) malloc (tổng số phần tử * sizeof(kiểu dữ liệu));

Ví dụ:

int *p, n;
//p là con trỏ của mảng
//n là tổng số phần tử cần cấp phát


//Chúng ta sử dụng 1 trong 2 dạng cấp phát sau:
p = (int *) calloc( n, sizeof( int )); 
p = (int *) malloc( n * sizeof( int ));

      Khi sử dụng cấp phát cho mảng xong thì sau khi sử dụng các bạn cần có thêm lệnh free() để giải phóng bộ nhớ.

Cú pháp: free(tên con trỏ);

Ví dụ:

free(p);

2.  Đối với ngôn ngữ C++

     <tên con trỏ>= new <kiểu dữ liệu>(tổng số phần tử);

    Ví dụ:

int *p, n;
//p là con trỏ của mảng
//n là tổng số phần tử cần cấp phát

p = new int[n]; 

    Khi sử dụng cấp phát cho mảng xong thì sau khi sử dụng các bạn cần có thêm toán tử delete để giải phóng bộ nhớ.

Cú pháp: delete[ ] <tên con trỏ>;

delete[] p;

 

3. Ví dụ sử dụng con trỏ cấp phát mảng động để nhập và in ra các phần tử trong mảng

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

int main()
{
  int *p,n,i;
  //Khai báo cấp phát động cho mảng (con trỏ) p
    p=(int *)calloc(n,sizeof(int));

  //Nhập số phần tử cho mảng
  printf("Nhap so phan tu mang\n");
  scanf("%d",&n);

 //Nhập dữ liệu cho mảng
  for(i=0;i<n;i++)
  {
      printf("Nhap so phan tu thu %d: ",i+1);
      scanf("%d",&p[i]);
  }

// In dữ liệu mảng
printf("Mang vua nhap la\n");
 for(i=0;i<n;i++)
  {
      printf("%8d",p[i]);
  }

  free(p); //Giải phóng bộ nhớ cho mảng
  system("pause");
}

    Khi chạy chương trình thì các thao tác nhập mảng và in mảng hoàn toàn như việc sử dụng mảng bình thường như mảng cứng.

 


Categories: ,

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *