liyiqi 发表于 2019-12-5 15:30:16

为什么会报错

本帖最后由 liyiqi 于 2019-12-5 15:45 编辑

#include<stdio.h>
void move(int *matrix);
int main()
{
        int a={{1,2,3},{4,5,6},{7,8,9}};
        int i,j;
        printf("转置前\n");
        for(i=0;i<3;i++)
        {
                for(j=0;j<3;j++)
                {
                        printf("%3d",*(*(a+i)+j));
                }printf("\n");
       }
       
        move(a);
        printf("转置后\n");
        for(i=0;i<3;i++)
        {
                for(j=0;j<3;j++)
                {
                        printf("%3d",*(*(a+i)+j));
                }printf("\n");
       }
       
        return 0;
}
void move(int *matrix)
{
        int i,j;
       
        for(j=0;i<3;i++)
        {
                for(i=0;j<3;j++)
                {
                        printf("%3d",*(matrix+j*3+i));
                }printf("\n");
       }                
}在move(a)错了

jackz007 发表于 2019-12-5 15:52:46

本帖最后由 jackz007 于 2019-12-5 16:13 编辑

#include<stdio.h>

void move(int (* matrix))      // 被调用函数定义前置可以避免调用前的函数声明
{
      int i , j, t                                                         ;
      for(i = 0 ; i < 3 ; i ++) for(j = 0 ; j < i ; j ++) {
                t = *( *(matrix + i) + j)                                        ;
                *( *(matrix + i) + j) = *( *(matrix + j) + i)                  ;
                *( *(matrix + j) + i) = t                                        ;
      }
}

int main()
{
      int a = {{1 , 2 , 3} ,{4 , 5 , 6} ,{7 , 8 , 9}} , i , j            ;
      printf("转置前\n")                                                       ;
      for(i = 0 ; i < 3 ; i ++) {
                for(j = 0 ; j < 3 ; j ++) printf("%3d" , * ( * (a + i) + j))   ;
                printf("\n")                                                   ;
      }
      move(a)                                                                  ;
      printf("转置后\n")                                                       ;
      for(i = 0 ; i < 3 ; i ++) {
                for(j = 0 ; j < 3 ; j ++) printf("%3d" , * (* (a + i) + j))      ;
                printf("\n")                                                   ;
      }
}
      编译运行实况:
C:\Bin>g++ -o x x.c

C:\Bin>x
转置前
123
456
789
转置后
147
258
369

C:\Bin>
      前面的代码数组元素一律采用指向数组的指针表达,如果用二维数组方式表达,会更加简单清楚。
#include<stdio.h>

void move(int matrix[])      // 被调用函数定义前置可以避免调用前的函数声明
{
      int i , j, t                      ;
      for(i = 0 ; i < 3 ; i ++) for(j = 0 ; j < i ; j ++) {
                t = matrix            ;
                matrix = matrix ;
                matrix = t            ;
      }
}

int main()
{
      int a = {{1 , 2 , 3} ,{4 , 5 , 6} ,{7 , 8 , 9}} , i , j ;
      printf("转置前\n")                                          ;
      for(i = 0 ; i < 3 ; i ++) {
                for(j = 0 ; j < 3 ; j ++) printf("%3d" , a)   ;
                printf("\n")                                          ;
      }
      move(a)                                                       ;
      printf("转置后\n")                                          ;
      for(i = 0 ; i < 3 ; i ++) {
                for(j = 0 ; j < 3 ; j ++) printf("%3d" , a)   ;
                printf("\n")                                          ;
      }
}
      这份代码的编译和执行效果与前面完全一样。
页: [1]
查看完整版本: 为什么会报错