C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!

#include<stdio.h>
int *sr(void)
{
int arr[3][3];
int (*p)[3] =arr;
for(int i=0;i<=2;i++)
for(int j=0;j<=2;j++)
scanf("%d",*(p+i)+j);
return *p;
}
int main(void)
{int *pp=sr();
printf("123");
return 0;}

在子函数申请二维数组,主函数使用,可以用动态申请。

方法不止一种,我这里用指针的指针实现二维数组。

二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。

#include<stdio.h>
#include<malloc.h>
int ** sr(void)
{
    int i,j;
    int *memory=(int *)malloc(sizeof(int)*9);//申请完整的连续内存地址3*3
    int **arr=(int **)malloc(sizeof(int*)*3);//申请二维数组行指针数组(也就是二维数组)
    if(!memory || !arr){
        printf("内存申请错误!\n");return NULL;}
    for(i=0,j=0;i<9;i+=3)//将连续地址按列数,取出每行首地址,赋值给二维数组元素
        arr[j++]=&memory[i];
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            scanf("%d",&arr[i][j]);
    return arr;
}
int main(void)
{
    int i,j,**arr=sr();
    if(!arr)
        return 1;
    printf("---主函数调用子函数定义的二维数组---\n");
    for(i=0;i<3;i++,printf("\n"))
        for(j=0;j<3;j++)
            printf("%d ",arr[i][j]);
    printf("\n---实现二维数组地址连续性---\n");
    int *p=&arr[0][0];
    while(p<=&arr[2][2])
        printf("%d ",*p++);
    return 0;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-02-18

这样就可以了:

#include<stdio.h>
#include<malloc.h>
int **sr(void)
{ int i,j,**arr;//定义二维指针
  arr = (int**)malloc(sizeof(int*) * 3);//为指针申请空间,
  for (i = 0; i < 3; i++)//行数
  { arr[i] = (int *)malloc(sizeof(int) * 3);//为每一行申请存储空间
    for(j=0; j<3; j++)
      scanf("%d",arr[i]+j);
  }
  return arr;
}
int main(void)
{ int i,j,**pp=sr();
  for (i = 0; i < 3; i++)//行数
  { for(j=0; j<3; j++)
      printf("%4d",pp[i][j]);
    printf("\n");
  }
  return 0;
}

本回答被提问者采纳
相似回答