0

Phân biệt arr và &arr trong C

Trong lập trình C, khi bạn khai báo int arr[5], mặc dù arr&arr đều trả về cùng một con số (địa chỉ bộ nhớ), nhưng kiểu dữ liệu và cách chúng di chuyển lại hoàn toàn khác nhau.

1. Sự khác biệt về ý nghĩa

Hãy tưởng tượng một tòa chung cư có 5 căn hộ:

  • arr: Giống như ta đang đứng ở cửa căn hộ đầu tiên. Nếu ta bước thêm 1 bước (arr + 1), chuyển sang căn hộ thứ hai.
  • &arr (Địa chỉ mảng): Giống như đang đứng nhìn cả tòa nhà. Nếu ta bước thêm 1 bước (&arr + 1), bạn nhảy sang tận... tòa nhà tiếp theo.

image.png

2. Ví dụ minh họa

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};

    printf("Dia chi bat dau: %p\n", (void *)arr);     // Địa chỉ bắt đầu của arr
    printf("Dia chi arr[0] : %p\n", (void *)&arr[0]); // Địa chỉ của phần tử index = 0
    printf("Dia chi arr[1] : %p\n", (void *)&arr[1]); // Địa chỉ của phần tử index = 1
    printf("Dia chi phan tu phia sau arr[4]: %p\n", (void *)(&arr[4] + 1));

    // 1. Nhảy theo đơn vị phần tử
    printf("arr + 1     = %p (Nhay 4 bytes - sang phan tu tiep theo)\n", (void *)(arr + 1));

    // 2. Nhảy theo đơn vị mảng
    printf("&arr + 1    = %p (Nhay 20 bytes - ra khoi pham vi mang)\n", (void *)(&arr + 1));

    return 0;
}

Output

Dia chi bat dau: 0x7ffcf377d1e0 🟩
Dia chi arr[0] : 0x7ffcf377d1e0 🟩
Dia chi arr[1] : 0x7ffcf377d1e4 🟦
Dia chi phan tu phia sau arr[4]: 0x7ffcf377d1f4 🟥
arr + 1     = 0x7ffcf377d1e4 🟦 (Nhay 4 bytes - sang phan tu tiep theo)
&arr + 1    = 0x7ffcf377d1f4 🟥 (Nhay 20 bytes - ra khoi pham vi mang)

Tại sao kết quả lại như vậy?

  • arr + 1 thực chất là: địa chỉ + 1 * sizeof(int).
  • &arr + 1 thực chất là: địa chỉ + 1 * sizeof(arr) (tức là cả 5 phần tử).

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí