To declare an array of pointers to these arrays
int a[3]={'4','1','3'};
int b[3]={'a','1','3'};
int c[3]={'y','1','3'};
you need to write
int * p[3] = { a, b, c };
In this declaration the array designators used as initializers are implicitly converted to pointers to their first elements. That is it is the same if to write
int * p[3] = { &a[0], &b[0], &c[0] };
This expression statement
p[1]=a[1];
is incorrect because the left side operand has the type int * while the right side operand has the type int.
This statement
*(p+1)= a+1;
that is equivalent to the statement
p[1] = a + 1;
or to
p[1] = &a[1];
is correct.
In this statement
printf("%d",p[1]);
there is used an incorrect conversion specifier %d with pointer expression p[1].
If you want to output the pointer expression p[1] then you need to write
printf( "%p\n", ( void * )p[1] );
If you want to output the pointed value by the expression p[1] you need to write
printf( "%d\n", *p[1] );
Or if you want to output it as a character you can write
printf( "%c\n", *p[1] );
int *p[2];-->int *p[3];This won't even compile:p[1] = a[1];becausea[1]is anintandp[1]is anint *. What about:int *p[3]; p[0] = a; p[1] = b; p[2] = c;?