【问题标题】:C passing 2D array to function, printing resultsC将二维数组传递给函数,打印结果
【发布时间】:2015-06-02 08:01:41
【问题描述】:

我试图通过将二维数组传递给函数来打印它,但结果很奇怪。这是我的代码。

#include <stdio.h>

int main()
{
    int b[2][3] = {{1,2,3},{4,5,6}};
    printArray(b);
    return 0;
}

void printArray(int (*ptr)[3])
{
    int i, j;
    for(i = 0; i < 2; i++)
    {
        for(j = 0; j < 3; j++)
        {
            printf("%d\t", *((*ptr+i)+j));
        }
        printf("\n");
    }
}

但是,输出是

1  2   3

2  3   4

我认为这与我的“j”变量有关,但我似乎无法确定它。请帮忙。

【问题讨论】:

    标签: c function pointers memory-address


    【解决方案1】:

    您需要在使用解引用运算符之前应用加法运算符。您需要使用括号,因为解引用运算符(*)的优先级高于加法运算符(+)。

    所以,这个

    printf("%d\t", *((*ptr+i)+j));
    

    应该是

    printf("%d\t", *((*(ptr+i))+j));
    

    或更好

    printf("%d\t", ptr[i][j]);
    

    另外,您需要将函数printArray 移动到main 之前,或者在main 之前提供函数原型,例如:

    void printArray(int (*ptr)[3]);
    

    【讨论】:

    • 感谢您的精彩解释!
    【解决方案2】:

    在添加 j 之前,您需要将 i 乘以 3 ...

    printf("%d\t", *((*ptr+(i*3))+j));
    

    【讨论】:

      【解决方案3】:

      放弃索引以支持指针,假设矩阵按行存储(通常是这种情况):

      #include <stdio.h>
      
      void printArray(int *);
      
      int main()
      {
       int b[2][3] = {{1,2,3},{4,5,6}};
       printArray((int*)b);
       return 0;
      }
      
      void printArray(int *ptr)
      {
      int i, j;
       for(i = 0; i < 2; i++)
       {
          for(j = 0; j < 3; j++)
          {
           printf("%d\t", *ptr++);
          }
        printf("\n");
       }
      }
      

      输出:

      1   2   3   
      4   5   6
      

      【讨论】:

        【解决方案4】:

        printArray 可以接受nb_column nb_line 参数并处理各种二维数组

        #include <stdio.h> 
        
        static void printArray(int *ptr,  int nb_columns, int nb_lines) 
        { 
            int i, j; 
            for(i = 0; i < nb_lines; i++) 
            { 
                for(j = 0; j < nb_columns; j++) 
                { 
                    printf("%d\t", *(ptr++)); 
                } 
                printf("\n"); 
            } 
        } 
        int main() 
        { 
            int b[2][3] = {{1,2,3},{4,5,6}}; 
            printArray((int *)b, 3, 2); 
            return 0; 
        } 
        

        【讨论】:

        • int(*)[3] 转换为int* 是否安全?
        猜你喜欢
        • 2020-08-28
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多