diff: 00000031
Всё верно, 16-ричное 31 = десятичное 49. Ошибок две:
1. Не учитывается, что и array[49], и array[0] - оба принадлежат массиву. Поэтому разность считается с ошибкой на 1 элемент.
2. Не учитывается, что арифметика указателей привязана к размерности типов. Проще говоря, разница между двумя указателями на int - это уже смещение, кратное int - отсюда получается 49, а не 49*4. Чтобы получить абсолютную разницу адресов, нужно привести оба указателя к void*
Попробовал, компилятор ругается. Компилятор - g++, последняя версия MinGW
#include <cstdio>
#include <stddef.h>
int main(void)
{
ptrdiff_t diff;
int array[50];
for(int i = 0; i<50; i++)
{
array[i]=i+1;
}
printf("first: %d, last: %d, firstptr: %p lastptr: %p\n",array[0], array[49], array, &array[49] );
diff = (void*)&array[49] - (void*)&array[0];
printf("arraysize is: %d , diff: %p, sizeof(int): %d", diff/sizeof(int), diff, sizeof(int));
return 0;
}
вывод:
D:\dmc\bin>g++ array_length.c
array_length.c: In function `int main()':
array_length.c:13: error: invalid use of `void'
PS ты наверное имел ввиду не "отсюда получается 49, а не 49*4." а "49/3"?
PPS а вообще, про пункт 2, т.е. как я понял, разность между конечным и начальным адрессом массива это и будет величина, кратная типу массива?
Я вначале считал с позиции логики своей - от конечного адреса вычесть начальный, получался бы массив памяти. Который если поделить на sizeof(int), то получалась бы длинна массива. =\