14/10/2018, 21:38

Con trỏ và mảng trong lập trình C

Học lập trình C++ Trong bài viết này, bạn sẽ tìm hiểu về mối quan hệ giữa con trỏ và mảng trong lập trình C , và sử dụng chúng một cách hiệu quả trong chương trình của mình. Mảng có liên quan chặt chẽ với con trỏ trong lập trình C nhưng sự khác biệt quan trọng giữa chúng là, một ...

Học lập trình C++

Trong bài viết này, bạn sẽ tìm hiểu về mối quan hệ giữa con trỏ và mảng trong lập trình C, và sử dụng chúng một cách hiệu quả trong chương trình của mình.

Mảng có liên quan chặt chẽ với con trỏ trong lập trình C nhưng sự khác biệt quan trọng giữa chúng là, một biến con trỏ có các địa chỉ khác nhau cũng như giá trị. Trong khi đó, trong trường hợp mảng là cố định.

Ví dụ sau sẽ chứng minh điều này cho bạn:

#include <stdio.h>
int main()
{
   char charArr[4];
   int i;

   for(i = 0; i < 4; ++i)
   {
      printf("Dia chi cua charArr[%d] = %u
", i, &charArr[i]);
   }

   return 0;
}

Kết quả:

Dia chi cua charArr[0] = 6487616
Dia chi cua charArr[1] = 6487617
Dia chi cua charArr[2] = 6487618
Dia chi cua charArr[3] = 6487619

Lưu ý: Bạn có thể nhận được địa chỉ khác nhau của một mảng. Có sự khác biệt giống nhau (sự khác nhau 1 byte) giữa bất kỳ hai phần tử liên tiếp nào của mảng charArr. Đối với con trỏ, nó có thể trỏ vào vị trí của một biến khác, nó có thể lưu trữ bất kỳ địa chỉ nào.

Mối quan hệ giữa con trỏ và mảng trong lập trình C

Ví dụ mảng:

int arr [4];
Con trỏ và mảng trong lập trình C

Trong lập trình C, tên của mảng luôn trỏ đến địa chỉ của phần tử đầu tiên của mảng.

Trong ví dụ trên, arr và & arr[0] trỏ tới địa chỉ của phần tử đầu tiên.

Vì địa chỉ của cả hai đều giống nhau, các giá trị của arr và & arr[0] cũng giống nhau.

arr[0] tương đương với *arr (giá trị của một địa chỉ của con trỏ)

Tương tự:

&arr[1] tương đương với (arr + 1) và arr[1] tương đương với *(arr + 1).
&arr[2] tương đương với (arr + 2) và arr[2] tương đương với *(arr + 2).
&arr[3] tương đương với (arr + 3) và arr[3] tương đương với *(arr + 3).
.
.
&arr[i] tương đương với (arr + i) và arr[i] tương đương với *(arr + i).

Trong C, bạn có thể khai báo một mảng và có thể sử dụng con trỏ để thay đổi dữ liệu của một mảng.

Ví dụ: Chương trình tính tổng 6 chữ số nhập từ bàn phím với con trỏ và mảng

#include <stdio.h>

int main() {
  int i, arr[6],sum = 0;
  printf("Nhap 6 so nguyen:
");
  for(i = 0; i < 6; ++i)
  {
      // (arr + i) la tuong duong voi &arr[i]
      scanf("%d", (arr + i));

      // *(arr + i) la tuong duong voi arr[i]
      sum += *(arr + i);
  }
  printf("Sum = %d", sum);
  return 0;
}

Kết quả:

Nhap 6 so nguyen:
1
2
3
4
5
6
Sum = 21
Học lập trình C++
0