0

Tính index phần tử trong mảng C dựa trên địa chỉ pointer

Trong bài này, tôi sẽ hướng dẫn cách tìm index của phần tử từ địa chỉ của nó trong mảng.

Lưu ý

Các phép tính với con trỏ chỉ hợp lệ khi nó cùng kiểu và cùng object (mảng, ...) .

  • Cùng mảng, cùng kiểu
    int arr[5] = {10, 20, 30, 40, 50};
    int *p1 = &arr[1];
    int *p2 = &arr[3];

    printf("Index distance: %ld\n", p2 - p1); // 3 - 1 = 2 ✅
}
  • Khác mảng
    int arr1[5] = {1,2,3,4,5};
    int arr2[5] = {6,7,8,9,10};
    int *p1 = &arr1[2];
    int *p2 = &arr2[1];

    printf("Distance: %ld\n", p2 - p1); // ❌ Undefined Behavior
}
  • Khác kiểu
    int arr[5] = {1,2,3,4,5};
    double *p1 = (double*) &arr[0];
    int *p2 = &arr[2];

    printf("Distance: %ld\n", p2 - p1); // ❌ UB
}

Code mẫu

#include <stdio.h>
#include <stdint.h>

#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))

#define INDEX_OF_SAFE(ptr, arr)                                     \
({                                                                  \
    size_t __idx = (size_t)((ptr) - &(arr)[0]);                     \
    (__idx < ARRAY_SIZE(arr)) ? __idx : (size_t)(-1);                \
})


int main()
{
  uint8_t arr[5] = {1, 2, 3, 4, 5};
  
  printf("Index của số 4 trong arr: %d\n", INDEX_OF_SAFE(&arr[3], arr));
  printf("Index của số 5 trong arr: %d\n", INDEX_OF_SAFE(&arr[4], arr));
  
  // Giả sử ta tìm index của x là một sô nằm ngoài phạm vi của arr
  printf("Index của số x trong arr: %d\n", INDEX_OF_SAFE(&arr[5], arr));
  
  return 0;
}

Output:

Index của số 4 trong arr: 3
Index của số 5 trong arr: 4
Index của số x trong arr: -1

Ở đây, đối với index của giá trị x nào đó nằm ngoài phạm vi => Trả về -1.


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í