【问题标题】:Error while printing 2D array using pointers使用指针打印二维数组时出错
【发布时间】:2020-02-07 20:54:42
【问题描述】:

我想使用指针打印二维数组,但在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");
        }
    }

请帮我解决这个错误。

【问题讨论】:

  • 请不要张贴文字图片。将文本作为文本发布。 Edit你的问题。
  • 试试printf("%d", *(p+i*3+j));
  • 我投票结束这个问题,因为代码应该作为代码而不是图片发布。
  • 我已编辑帖子以包含文本和嵌入图像,它们都显示在您最初使用的链接中。这是更永久的,并且更容易让潜在的回答者访问。链接不是发布问题内容的最佳选择。然而,它们非常适合指向您可能包含的参考资料,以澄清观点等。
  • 如果你还没有看过,这个tour很简短但很有用。

标签: c arrays loops for-loop error-handling


【解决方案1】:

对于根据 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 

【讨论】:

    【解决方案2】:

    a 是指向指针的指针,但您将其分配给指针。如果你解决了这个问题,休息应该可以正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 2017-02-16
      • 2016-05-14
      • 2015-02-03
      • 2020-03-26
      相关资源
      最近更新 更多