Ошибка при печати 2D-массива с помощью указателей - PullRequest
0 голосов
/ 10 октября 2019

Я хочу напечатать 2D-массив, используя указатели, но в операторе printf он показывает недопустимый аргумент типа: (см. Ошибку на изображении ниже :)

    #include<stdio.h>

    void main()
    {
        int a[3][3]={1,2,3,4,5,6,7,8,9};

        int i,j;
        int *p;
        p=&a;
        for(i=0;i<3;i++)
        {
            for(j=0;j<3;j++)
                printf("%d",*(p+i)+j);
            printf("\n");
        }
    }

, пожалуйста, помогите мне с этой ошибкой.

enter image description here

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Для пускателей согласно стандарту 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 
1 голос
/ 10 октября 2019

a - указатель на указатель, но вы назначаете его указателю. Если вы это исправите, отдых должен нормально работать

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