Ссылка на адрес? - PullRequest
       1

Ссылка на адрес?

1 голос
/ 05 сентября 2010
#include<stdio.h>
int main(void) {
int arr[3]={1,2,3};
return 0;
}

Теперь, что мне даст * 1002 и почему? Я хочу подробное объяснение. Не говорите мне, как * и & отменяют: P

Я хочу знать, как компилятор интерпретирует это выражение для получения желаемого результата.

Ответы [ 2 ]

6 голосов
/ 05 сентября 2010

&arr создает указатель на массив - он имеет тип int (*)[3] и указывает на массив arr.

*&arr разыменовывает этот указатель - это сам массив. Теперь, что происходит сейчас, зависит от того, что вы будете делать с этим. Если вы используете *&arr в качестве субъекта операторов sizeof или &, то он дает размер или адрес массива соответственно:

printf("%zu\n", sizeof *&arr);    /* Prints 3 * sizeof(int) */

Однако, если вы используете его в любом другом контексте, то он оценивается как указатель на его первый элемент:

int *x = *&arr;
printf("%d\n", *x);    /* Prints 1 */

Другими словами: *&arr ведет себя так же, как и arr, как и следовало ожидать.

0 голосов
/ 05 сентября 2010

Поскольку arr является статически распределенным массивом, а не указателем переменная - выражение &arr эквивалентно arr. Следовательно, *(&arr) на самом деле *arr.

Все было бы иначе, если бы arr был указателем.

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