ссылочный массив == массив - PullRequest
3 голосов
/ 16 февраля 2012

Не могли бы вы сказать, почему значение ссылочного массива и значение самого массива имеют одно и то же значение?

я знаю, что это тип типа int *, но с & a он должен быть int **или я не прав ??поэтому значение должно быть указателем на указатель типа int.пример кода:

    #include &ltstdio.h>

    int main()
    {
        int a[10];
        printf("a without ref.: 0x%x\n",a);
        printf("a with    ref.: 0x%x\n",&a);
        return 0;
    }

http://ideone.com/KClQJ

Ответы [ 4 ]

3 голосов
/ 16 февраля 2012

В этом случае имя массива распадается на указатель на его первый элемент.

1 голос
/ 16 февраля 2012

Учитывая объявление массива T a[N], выражение &a имеет тип "указатель на массив N-элементов T (T (*)[N]), а его значение является базовым адресом массива. В этом отношении унарный оператор & ведет себя так же для массивов, как и для любого другого типа данных.

Что удивительно, так это то, как C обрабатывает выражение массива a. За исключением случаев, когда он является операндом операторов sizeof или унарных & или является строковым литералом, используемым для инициализации другого массива в объявлении, выражение массива типа "массив N-элементов из T" (T [N]) будет заменено ("decay to") выражением указателя типа "pointer to T" (T *), а его значением будет адрес первого элемента массива. IOW, a == &a[0].

Поскольку адрес первого элемента массива совпадает с базовым адресом всего массива, выражения a и &a выдают одинаковое значение , но типы различаются (T * в отличие от T (*)[N]).

1 голос
/ 16 февраля 2012

Имя массива будет неявно преобразовываться в указатель, за исключением двух ситуаций, одна ситуация - «& array», другая - «sizeof (array)». В обоих случаях имя массива является массивом, а неуказатель.

Например:

int a[10];
int *p;
p = a;        //a is a pointer
p = &a;       //a is a array,&a is a constant pointer
sizeof(a);    //a is array
0 голосов
/ 16 февраля 2012

если есть int * p, который указывает a, то

a + 0 == & a [0] == p + 0 == & p [0]: адрес

* (a + 0) == * (& a [0]) == * (p + 0) == * (& p [0]): данные

a == & a == & a [0]

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