когда я работаю над указателями на веб-сайте, придерживаюсь точки.
когда ı пишут данный пример, ı может назначать адреса массива на указателе для приращения пример указателя, такого как ptr = arr; и он работает правильно, но когда ı делает то же самое для примера декремента, он не работает, он работает только тогда, когда они пишут как это ptr = & arr [2]. Почему я должен написать амперсанд для примера декремента? В чем разница между этими двумя?
int main() { int arr[3]={10,20,30}; int *ptr,i; ptr=arr; for(i=0;i<3;i++) { printf("adress of variable arr[%d] %x\n",i+1,ptr); printf("value of arr[%d] = %d\n",i+1,*ptr); ptr++; } return 0; }
Разница в том, что в случае "уменьшения" вы используете []
. Подумайте об arr
как о ссылке на целый массив, таким образом, это нормально (компилятор), чтобы сделать ptr=arr
или ptr=&arr
с тем же результатом. С другой стороны, arr[3]
является ссылкой на объект в массиве, поэтому вам нужно явно указать его адрес (для вас нет оптимизации компилятора).
Вам не нужно писать это, просто используйте указатель:
ptr = var + 2 ;
for(i=0;i<3;i++)
{
printf("%d" , *ptr ) ;
ptr-- ;
Обратите внимание, что последний элемент находится в +2
не +3.
в случае int arr[3]
&arr[0]
а arr
указывает на одно и то же, базовый адрес массива или адрес первого элемента в массиве. Поэтому в вашем инкрементном случае вам разрешено писать ptr = var
что не что иное, как сохранение начального адреса в отдельном указателе.
В случае декрементов нет ничего, что может указывать непосредственно на адрес элемента end-of-array. Таким образом, вы должны использовать адрес последнего элемента [ &arr[n-1]
, n
- размер], чтобы обозначить адрес последнего элемента.