Недавно я переключился на C и пытался вычислить указатели.
#include <stdio.h>
int main()
{
int arr[5] = {1,2,3,4,5};
int *a = &arr;
printf("Array : %p\n", arr);
for(int i=0; i<5; i++)
{
printf("Value and Address of Element - %d : %d\t%p,\n", i+1, arr[i], &arr[i]);
}
printf("Pointer to the Array : %p\n", a);
printf("Value pointed by the pointer : %d\n", *a);
a = (&a+1);
printf("Pointer after incrementing : %p\n", a);
return 0;
}
Однако следующая строка, похоже, не работает.
a = (&a+1);
После печати увеличенного значения указателя a он все еще указывает на массив (arr). Вот результат работы программы:
Array : 0x7ffe74e5d390
Value and Address of Element - 1 : 1 0x7ffe74e5d390,
Value and Address of Element - 2 : 2 0x7ffe74e5d394,
Value and Address of Element - 3 : 3 0x7ffe74e5d398,
Value and Address of Element - 4 : 4 0x7ffe74e5d39c,
Value and Address of Element - 5 : 5 0x7ffe74e5d3a0,
Pointer to the Array : 0x7ffe74e5d390
Value pointed by the pointer : 1
Pointer after incrementing : 0x7ffe74e5d390
Как вы можете видеть, указатель «a» по-прежнему указывает на первый элемент. Однако теоретически не должно 'a' указывать на все, что находится после последнего элемента (учитывая, что & a + 1 увеличивает указатель на размер всего массива - источник: разница между a + 1 и & a + 1 )
Кто-нибудь может объяснить почему?