Для пускателей согласно стандарту C функция main без параметров должна быть объявлена как
int main( void )
Этот инициализатор указателя p
неверен.
int *p;
p = &a;
, потому чтоУказатель и его инициализатор имеют разные типы указателей, и между типами нет неявного преобразования.
Это выражение
*( *( p + i ) + j)
также недопустимо. Выражение * (p + i) дает объект типа int
не указателя типа.
Вы можете использовать следующие подходы
#include <stdio.h>
int main(void)
{
enum { N = 3 };
int a[N][N] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int *p = ( int * )a;
for ( size_t i = 0; i < N; i++ )
{
for ( size_t j = 0; j < N; j++ )
{
printf( "%d ", *( p + i * N + j ) );
}
putchar( '\n' );
}
putchar( '\n' );
for ( int ( *p )[N] = a; p != a + N; ++p )
{
for ( int *q = *p; q != *p + N; ++q )
{
printf( "%d ", *q );
}
putchar( '\n' );
}
putchar( '\n' );
return 0;
}
Вывод программы:
1 2 3
4 5 6
7 8 9
1 2 3
4 5 6
7 8 9