C语言,如何在子函数中写一个3*3二维数组,给主函数调用!! 急求:主函数中的二维数组如何才能在其他函数中被调用(C语言)

作者&投稿:僪羽 (若有异议请与网页底部的电邮联系)

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

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

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

#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("内存申请错误!
");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("---主函数调用子函数定义的二维数组---
");
    for(i=0;i<3;i++,printf("
"))
        for(j=0;j<3;j++)
            printf("%d ",arr[i][j]);
    printf("
---实现二维数组地址连续性---
");
    int *p=&arr[0][0];
    while(p<=&arr[2][2])
        printf("%d ",*p++);
    return 0;
}


这样就可以了:

#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("
");
  }
  return 0;
}


c语言中在主函数中定义了一个二维数组,用子函数赋值,再在另一个子函数中调用,如何定义,调用这个数组~

传地址进去就好int a【5】;
a就是地址;
#include
void output(int *a)
{
int i;
for(i=0;i<5;i++)
{
a[i]=i;
}
}
int main()
{
int a[5],j;
output(a);
for(j=0;j<5;j++)
{
printf("%d",a[j]);
}
}

正如楼下所言
int
**p
,定义的p是一个指向int*型的指针
int
(*p)[10]是一个指向数组的指针
数组长度为10
假如定义成
deal(int
**p),传参数时要加强制类型转换:
deal((int**)a);
并且使用p时不能用下标,p[2][3]是错误的,因为不知道p指向的int*型的长度,无法编译成*(p+2*10+3)
必须自己写成*(p+2*10+3)来调用
假如定义成
deal(int
(*p)[10])就不一样了,编译器就能知道p是一个指向长度为10的数组的指针
那么p[2][3]就能编译成*(p+2*10+3)了
总之,c语言是很灵活的,不同的定义方式配上不同的用法,都是能得到正确的结果的
不知道这么说楼主明白了没?
同样的还有多维数组对多维指针的问题,楼主可以自己类推一下

C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!
答:在子函数申请二维数组,主函数使用,可以用动态申请。方法不止一种,我这里用指针的指针实现二维数组。二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。include<stdio.h>#include<malloc.h>int ** sr(void){ int i,j; ...

c语言 用函数调用完成求一个3*3数组主对角线上所有元素的最大值。计 ...
答:int max(int a[][3]){ int maxf=a[0][0],i,j;for(i=0;i<3;i++)//左侧对角线 for(j=i;j<3;)if(a[i][j]){maxf=a[i][j];break;} for(i=0,j=2;i<3;i++,j--)//右侧对角线 if(a[i][j]>maxf)maxf=a[i][j];return maxf;} main(){ int a[3][3],...

在C语言中用函数解写一个函数,是给定的一个3*3的二维整型数组转置,即行 ...
答:j,temp; for(i=0;i<3;i++) for(j=0;j<i;j++) { temp=array[i][j]; array[i][j]=array[j][i]; array[j][i]=temp; }}void output(int (*array)[3]){ int i;

c语言:写一个函数,将输入的3*3的整形矩阵进行转置 用函数
答:int main(){ void move(int *s);int a[3][3];int i=0;int *p=&a[0][0];printf("请输入一个3*3的数组:\n");for(i=0;i<3;i++){ scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);} move(p);printf("转置后的结果:\n");for(i=0;i<3;i++){ printf("%d...

C语言 函数调用写一个函数,使给定的一个3*3的二维整型数组转置,即行 ...
答:方法一、include<stdio.h> void main(){ void switchArray(int[3][3]);int array[][3]={{1,2,3},{4,5,6},{7,8,9}};int i,j;switchArray(array);return 0;} void switchArray(int array[][3]){ int newArray[3][3];int i,j;for(i=0;i<3;i++){ for(j=0;j<3;j...

用函数写一个c语言程序,从键盘录入3*3数组
答:[4] ,这里已经明显超出了数组的范围了,所以错误。正确应该改成 第八行,第一个for(i = 0;i < 3;i++)第十行,第二个for(j = 0;j < 2;j++)另外从习惯上讲,每次要求输入时最好能有一个提示语句显示出来,因此第十二行第二个 for 里面可以增加一条语句显示一个提示输入的信息。

用C语言的指针方法处理:写一函数,将一个3*3的整形矩阵转置
答:方型矩阵转置比较简单,对上三角或下三角做交换即可。include "stdio.h"void Transpose(int (*matrix)[3]){ int temp;int i, j;for(i=1;i<3;i++)/*转置*/ { for(j=0;j<i;j++){ temp = *(*(matrix+j)+i);(*(matrix+j)+i) = *(*(matrix+i)+j);(*(matrix+i)+j) =...

c语言 2、写一函数,将3×3矩阵转置,输入一个矩阵,输出转置后的矩阵...
答:2.矩阵转置:3.字符串连接

写一个函数,将一个3乘3的整数矩阵转置。用指针方法处理。c语言求...
答:int main(){int i,j;void change();cout<<"请输入一个3*3的二维数组:"<<endl;for(i=0;i<3;i++)for(j=0;j<3;j++)cin>>a[i][j];//cout<<"转制后的矩阵是:"<<change()<<endl;// change();for(i=0;i<3;i++){ for(j=0;j<3;j++)cout<<a[i][j]<<" ";cout...

c++,C语言编程问题:求一个 3×3 矩阵对角线元素之和。
答:int main(){ int i,j,a[n][n],sum=0;printf("请输入矩阵(3*3):\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&a[i][j]);for(i=0;i<n;i++)sum+=a[i][i];printf("对角线之和为:%d\n",sum);return 0;} C++ 代码 include<iostream> include<iomanip> ...