Mối quan hệ mảng và con trỏ

0 phút đọc

Trong bài học này, chúng ta sẽ tìm hiểu về mối quan hệ giữa mảng và con trỏ trong lập trình C. Ta 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ỏ.

Mối quan hệ giữa mảng và con

Mảng là một khối dữ liệu tuần tự, khi chúng ta in ra địa chỉ các phần tử của mảng như chương trình sau:

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

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

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

   return 0;
}
Kết quả
&x[0] = 000000000062FE00

&x[1] = 000000000062FE04

&x[2] = 000000000062FE08

&x[3] = 000000000062FE0C

&x[4] = 000000000062FE10

Address of array num: 000000000062FE00

Vì kích thước của int4 byte nên địa chỉ của hai phần tử mảng liên tiếp cũng chênh nhau 4 byte.

địa chỉ của &num[0]num là giống nhau vì num trỏ đến phần tử đầu tiên của mảng

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

Tương tự,

  • &num[1] tương đương với num+1num[1] tương đương với *(num+1)
  • &num[2] tương đương với num+2num[2] tương đương với *(num+2)
  • Về cơ bản, &num[i] tương đương với num+inum[i] tương đương với *(num+i)

Một số ví dụ để hiểu rõ hơn về con trỏ và mảng

Ví dụ 1:

#include <stdio.h>
int main() {

    int i, num[5], sum = 0;

    printf("Enter 5 numbers: ");

    for(i = 0; i < 5; ++i) {
        //  scanf("%d", &x[i]);
        scanf("%d", num+i);

        // Equivalent to sum += x[i]
        sum += *(num+i);
    }

    printf("Sum = %d", sum);

    return 0;
}
Kết quả
Enter 5 numbers: 1

-2

4

1

6

Sum = 10

Ví dụ 2:

#include <stdio.h>
int main() {

    int num[5] = {1, 2, 3, 4, 5};
    int* pn;

    pn = &num[3];

    printf("*pn = %d \n", *pn);
    printf("*(pn+1) = %d \n", *(pn+1));
    printf("*(pn-1) = %d", *(pn-1));

   return 0;
}
Kết quả
*pn = 4

*(pn+1) = 5

*(pn-1) = 3

Trong ví dụ này &num[3] là địa chỉ của phần tử thứ tư, được gán cho con trỏ pn, do đó giá trị của *pn lúc này sẽ là 4.

Và tương tự pn+1 sẽ trỏ vào phần tử thứ năm, *pn+1 lúc này sẽ mang giá trị là 5, còn *pn-1 sẽ mang giá trị là 3.

Avatar TechMely Team
Được viết bởi

TechMely Team

Cuộc sống không phải là phim ảnh, không có nhiều đến thế... những lần không hẹn mà gặp.
Khoá học javascript từ cơ bản đến chuyên sâuYoutube Techmely