Разница между указателем на указатель и указателем на массив?

Учитывая, что имя массива на самом деле является указателем на первый элемент массива, следующий код:

#include <stdio.h>

int main(void)
{
    int a[3] = {0, 1, 2};
    int *p;

    p = a;

    printf("%d\n", p[1]);

    return 0;
}

печатает 1 , как и ожидалось.

] Теперь, учитывая, что я могу создать указатель, указывающий на указатель, я написал следующее:

#include <stdio.h>                                                              

int main(void)                                                                  
{                                                                               
        int *p0;                                                                
        int **p1;                                                               
        int (*p2)[3];                                                           
        int a[3] = {0, 1, 2};                                                   

        p0 = a;                                                                 
        p1 = &a;                                                                
        p2 = &a;                                                                

        printf("p0[1] = %d\n(*p1)[1] = %d\n(*p2)[1] = %d\n",                    
                        p0[1], (*p1)[1], (*p2)[1]);                             

        return 0;                                                               
}

Я ожидал, что он будет скомпилирован и напечатан

p0[1] = 1
(*p1)[1] = 1
(*p2)[1] = 1

Но вместо этого во время компиляции все идет не так:

test.c: In function ‘main’:
test.c:11:5: warning: assignment from incompatible pointer type [enabled by default]

Почему это задание неправильное? Если p1 является указателем на указатель на int и a является указателем на int (потому что это имя массив int s), почему я не могу назначить & a на p1 ?

13
задан Trevor Hickey 17 November 2015 в 23:48
поделиться