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