Использование указателей в C - PullRequest
8 голосов
/ 25 августа 2011
#include <stdio.h>

int main(void)
{
    int a[5]={1,2,3,4,5};
    int *ptr=(int*)(&a+1);
    printf("%d %d\n",*(a+1),*(ptr-1));
    return 0;
}

Вывод:

2,5

Я не мог понять, как *(ptr-1) оценивается как 5 (правильный вывод).Но когда я сделал это вручную, это было 1. Мое понимание: *(ptr-1) будет оценено как *(&a+1-1), что будет *(&a), что равно 1.

Пожалуйста, помогите мне понять эту концепцию.

Ответы [ 2 ]

9 голосов
/ 25 августа 2011
int *ptr=(int*)(&a+1);

делает &a + 1 делает &a + sizeof (a), поскольку a является типом int [5], что заставляет ptr указывать на фактическое значение a[5] (недопустимо / превышает определенный предел)

(ptr - 1) указывает, таким образом, указывает на a[4] и *(ptr - 1) напечатает 5.

5 голосов
/ 25 августа 2011

В вашем printf вы извлекаете значение в позиции 1, увеличивая позицию на +1 с 0.

Во втором целом числе вы получаете 5, потому что &a+1 фактически указывает за пределы массива, поэтому, когда вы делаете *(ptr-1), он возвращает 5.Если вы удалите -1, то вы получите действительно странный результат (в моем случае это был -1078772784).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...