Hiểu Mối quan hệ giữa Mảng và Con trỏ

Trong hướng dẫn này, chúng ta cùng tìm hiểu về mối quan hệ giữa mảng và con trỏ trong lập trình C. Bạn cũng sẽ học cách truy cập các phần tử mảng bằng cách sử dụng con trỏ.

Trước khi bạn tìm hiểu về mối quan hệ giữa mảng và con trỏ, hãy nhớ kiểm tra hai chủ đề sau:

  • C Arrays
  • C Pointers

Mối quan hệ giữa Mảng và Con trỏ

Mảng là một khối dữ liệu tuần tự. Hãy viết chương trình in địa chỉ của các phần tử mảng.

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

   for(i = 0; i < 4; ++i) {
      printf("&x[%d] = %p\n", i, &x[i]);
   }

   printf("Address of array x: %p", x);

   return 0;
}

Đầu ra

&x[0] = 1450734448
&x[1] = 1450734452
&x[2] = 1450734456
&x[3] = 1450734460
Address of array x: 1450734448

Có sự khác biệt 4 byte giữa hai phần tử liên tiếp của mảng x . Đó là vì kích thước của intlà 4 byte (trên trình biên dịch của chúng tôi).

Lưu ý rằng, địa chỉ của & x [0] và x giống nhau. Đó là vì tên biến x trỏ đến phần tử đầu tiên của mảng.Mối quan hệ giữa Mảng và Con trỏ

Từ ví dụ trên, rõ ràng &x[0]là tương đương với x . Và, x[0]tương đương với *x.

Tương tự,

  • &x[1] is equivalent to x+1 and x[1] is equivalent to *(x+1).
  • &x[2] is equivalent to x+2 and x[2] is equivalent to *(x+2).
  • Basically, &x[i] is equivalent to x+i and x[i] is equivalent to *(x+i).

Ví dụ 1: Con trỏ và Mảng

#include <stdio.h>
int main() {
  int i, x[6], sum = 0;
  printf("Enter 6 numbers: ");
  for(i = 0; i < 6; ++i) {
  // Equivalent to scanf("%d", &x[i]);
      scanf("%d", x+i);

  // Equivalent to sum += x[i]
      sum += *(x+i);
  }
  printf("Sum = %d", sum);
  return 0;
}

Khi bạn chạy chương trình, kết quả đầu ra sẽ là:

Enter 6 numbers:  2
 3
 4
 4
 12
 4
Sum = 29 

Ở đây, chúng ta đã khai báo một mảng x gồm 6 phần tử. Để truy cập các phần tử của mảng, chúng ta đã sử dụng con trỏ.

Trong hầu hết các ngữ cảnh, tên mảng phân rã thành con trỏ. Nói một cách đơn giản, tên mảng được chuyển đổi thành con trỏ. Đó là lý do tại sao bạn có thể sử dụng con trỏ để truy cập các phần tử của mảng. Tuy nhiên, bạn nên nhớ rằng con trỏ và mảng không giống nhau .

Có một số trường hợp tên mảng không phân rã thành con trỏ. Để tìm hiểu thêm hãy xem ví dụ dưới

Ví dụ 2: Mảng và con trỏ

#include <stdio.h>
int main() {
  int x[5] = {1, 2, 3, 4, 5};
  int* ptr;

  // ptr is assigned the address of the third element
  ptr = &x[2]; 

  printf("*ptr = %d \n", *ptr);   // 3
  printf("*(ptr+1) = %d \n", *(ptr+1)); // 4
  printf("*(ptr-1) = %d", *(ptr-1));  // 2

  return 0;
}

Khi bạn chạy chương trình, kết quả đầu ra sẽ là:

*ptr = 3 
*(ptr+1) = 4 
*(ptr-1) = 2

Trong ví dụ này, &x[2]địa chỉ của phần tử thứ ba, được gán cho con trỏ ptr . Do đó, 3đã được hiển thị khi chúng tôi in *ptr.

Và, prt *(ptr+1)cung cấp cho chúng ta yếu tố thứ tư. Tương tự, việc prt *(ptr-1)cho chúng ta yếu tố thứ hai.










Gõ tìm kiếm nhanh...