Я просто не могу понять ошибку в следующей программе. Я назначил адрес массива размером 5 указателю ptr типа (*)[]
. Несоответствия типов нет и это нормально, но потом я хочу напечатать значение ptr + 1. Как я и ожидал, он показывает ошибку о неуказанных границах. Но мне просто не хватает того, как тот же ptr+1
работает нормально когда я привел его к типу void*
.
Кастинг - это нормально, но прежде, чем дойти до этого, как программа может вычислить ptr+1
, если она просто не знает границ? Как он узнает, двигаться ли вперед на 5 элементов, на 8 элементов вперед или на какие-либо элементы вперед? Почему (void*)ptr+1
не показывает ту же ошибку, что и ptr+1
?
Чтобы лучше выделить все это, я также использовал указатель ctr
, который явно объявлен как имеющий тип (*)[5]
вместо (*)[]
. Пожалуйста, назовите мне технические причины этого. Спасибо.
#include<stdio.h>
int main(void)
{
int ar1[5]={1,5,3,8,9};
int (*ptr)[]=&ar1,(*ctr)[5]=&ar1;
printf("%p\n",ptr+1); //ERROR about unspecified bounds
printf("%p\n",(void*)ptr+1); //It's ok
printf("%p\n",ctr+1); //It's ok
}
PSST !! Последние два правильных printf()
не дают одинакового значения. Если я закомментирую неправильную строку printf("%p\n",ptr+1);
, это будет результат.
0023FF25
0023FF38
PSST!!
Я проверил это снова, в ptr+1
части (void*)ptr+1
, 1
просто добавляется к числовому значению ptr
. Что происходит?