c语言中在不知道二维数组行列数的情况下怎么在函数里调用这个二维数组?

作者&投稿:甘徐 (若有异议请与网页底部的电邮联系)
C语言,如何在子函数中写一个3*3二维数组,给主函数调用!!~

在子函数申请二维数组,主函数使用,可以用动态申请。
方法不止一种,我这里用指针的指针实现二维数组。
二维数组除了行列,本身地址也是连续的,从第一行第一列的元素地址++,可以取出所有元素。所以我这里先申请了完整的连续地址。

#include#includeint ** 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;}

正如楼下所言
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语言是很灵活的,不同的定义方式配上不同的用法,都是能得到正确的结果的
不知道这么说楼主明白了没?
同样的还有多维数组对多维指针的问题,楼主可以自己类推一下

行数 = sizeof(array)/sizeof(array[0]);
列数 = sizeof(array[0])/sizeof(array[0][0]);

你也可以在函数形参里加入行列值,然后主函数调用子函数的时候,把行列数做为参数传过去。

可以给函数多加两个参数来确定行列数


C语言如何求一个二维数组有几行,还有为什么会提示gets()是一个未定...
C语言中求一个二维数组有几行的方法如下:假设有定义int nums[10][20];二维数组行数可以用sizeof计算:rows = sizeof(nums)\/sizeof(nums[0]);第二个问题,为什么gets会提示未定义标识,有两种可能:一、编译器支持gets库函数,但是你没有包含头文件#include<stdio.h>;二、编译器本身不支持gets库...

C语言问题二维数组a有m列,则在a[i][j]前的元素个数是什么?
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,...

c语言如何使用二维数组存储中文?
c语言宏定义 c语言二维数组存储方式 c语言定义标识符 c语言中的文件类型 c语言结束程序语句 ...苦等1小时: 假如在北京改灯的话 需要多少钱呢? 回答 苦等1小时: 难道离开他就不行吗 回答 苦

汉语是唯一的二维语言是什么?
我国的汉字并不是历史上唯一的二维字体,在历史上其实还有很多的表意的二维字体,这些文明曾经也十分的强大,但是他们最终都没有走到现代,走到现代的只有我们“一家”。二维字之所以难以传承下来,主要原因就是它太难学习了。现代我国人都说英语难学,实际上我国的汉字才是世界上公认的最难学习的语言,...

一个关于C语言中二维数组的问题(如何判断数组中的数全为1?)
最直接的办法就是调用函数,将该数组作为实参传递,然后在函数中定义一个变量flag作为标记,用循环遍历这个二维数组 如果数组元素为1则将flag置为1继续扫描,否则置为0并退出循环 返回flag,flag为1则表示数组元素全为1,否则不全为1

C语言中的二维数组名是一个二重指针吗?
不是 二级指针p也可以解释为指针的指针,即p内保存的值实际上还是一个指针,计算:p的值实际上是一个指针值,那么 *(*p)即二级指针指向的最终值 对于二维数组a[2][2],a也是一个地址,并且这个值也等于a[0],也等于a[0[0]的地址,即&a[0][0],由此看来对a取地址的值是一个变量值(不...

二维是什么三维又是什么
二维计算机图形主要用于本来采用传统印刷和绘制技术的那些应用场合,例如字体、地图、工程制图、广告、等等。在那些应用中,二维图像不仅仅是现实世界物体的一个表示,它本身是有附加含义的独立个体;因而二维模型在那些应用中更为实用,因为它们给出了比三维计算机图形更为直接的控制(三维图形更象摄影而非打印...

C语言中二维数组名是不是可以看作指针数组名?
所谓的“二维数组”,“二级指针”,“指针数组”,以及“数组指针”的理解应该为:基础类型为数组的数组,基础类型为指针的指针,基础类型为指针的数组,基础类型为数组的指针。比如二维数组定义为 int b[3][4]; ,可以看做:typedef int A[4];A b[3];其它类推。不知道表述清楚了没,有疑问加...

在c语言二维数组中怎样交换两个数组元素中的字符串,请写代码._百度知 ...
char buff[100];\/\/假设你的字符串不超过这么多而你的而为数组为char **argv;其中argv[0] = "...采纳率:48% 擅长: 常见软件 编程语言 C\/C++ 百度知道 百度百科 其他回答 char c[20];strcpy(c...更多关于二维数组的知识 > 网友都在找: 交换两个字符串数组中的数据 正在求助 换一换 回答问题,...

c语言中二维数组a[i][j],为什么a=*a?
这组数据在内存中是连续存放的。而在C语言的使用中,a是二维数组的首地址。*a也就是a[0],是二维数组第一行的首地址。所以,二者是相同的地址值,即数据a[0][0]的地址值。也就是说,从值上,a,*a, a[0],&a[0][0]都是相同的值。当时,说a=*a也并不是完全正确的,从类型上,a等同...

壤塘县13018279798: C语言 如何动态创建二维数组 -
柳紫三七: 这样的方法可行,不过要是题目要求输入m和n,然后再定义二维数组a[m][n],那就行不通了. 你可以这样做:(以int型为例) int **a; int m,n,i;scanf("%d%d",&m,&n);a=(int**)malloc(m*sizeof(int*)); /*malloc函数在stdlib.h里面,用的时候加入这个头文件*/ for(i=0;i<m;i++) a[i]=(int*)malloc(n*sizeof(int));/*这样以后你就可以把a当作二维数组a[m][n]来用了..

壤塘县13018279798: c语言中如何获取一个二维数组的行列数? -
柳紫三七: c语言中二维数组若声明为 int z[j][i]; j 是 数学里 二维数组 的 行数 i 是 数学里 二维数组 的 列数 数组元素 等于 数学里 z[y][x] 数组元素排列顺序: z[0][0],z[0][1],z[0][2]... z[1][0],z[1][1],z[1][2]... z[2][0],z[2][1],z[2][2]...

壤塘县13018279798: c语言 怎样用程序知道二维数组行数和列数
柳紫三七: 比如有这样一个二维数组: int a[3][5]; 求数组元素的总数: sizeof(a) / sizeof(int) 求数组列数: sizeof(a[0])/sizeof(int) 而数组行数则为 :( sizeof(a) / sizeof(int) )/ ( sizeof(a[0]) / sizeof(int) ) 不知道你明白了么?

壤塘县13018279798: C语言定义数组行列数的问题 -
柳紫三七: 同学你好,我也遇到过这样的问题,数组定义时,行列数不能用变量. 但是, 我们可以动态创建一个二维数组.你可以这样做:(以int型为例)int **a; int m,n,i; scanf("%d%d",&m,&n); //输入你此次想要创建数组的行数和列数,储存在m...

壤塘县13018279798: 如何在二维数组中查找指定的数,C语言 -
柳紫三七: 有两种方式: 1 二维数组的行列数在定义的时候就是确定好的,所以编程人员是知道二维数组的大小以及行列数的. 所以可以直接使用行列数的值. 为方便维护,可以将行列数定义为宏,直接调用对应的宏名作为行列值.2 动态获取. 对于...

壤塘县13018279798: C语言如何定义长度未知的数组最近在练C语言时遇到一个问题,想定义
柳紫三七: C语言在数组个数未知的情况下,根据应用情况不同,有三种方式.1,数组元素总数未知,但是需要存储的内容是已知的.其实这是一种变相的已知个数,只是编程者不...

壤塘县13018279798: C语言怎么用二维数组输入行数不确定的字符串 -
柳紫三七: 首先】是多行字符串的输入和保存.可以:开设一个字符串数组如下,其中N定义最多可记录多少行,M定义每行可保存多少个字符,改变#define定义可以调整这两个数据#define N 1024 //最多1024行#define M 256 //每行最多存储255个字符 ...

壤塘县13018279798: c语言编程:找出二维数组中的最大值最小值及其所在行号列号 -
柳紫三七: 示例:有一个3*4的矩阵,要求编程序求出其中最大的那个元素的值,以及其所在的行号和列号. 代码: #include<stdio.h> int main() { int i,j,row=0,colum=0,max; int a[3][4]={{1,2,3,4},{4,5,6,7},{-1,3,-5,10}}; max=a[0][0]; printf("array a:\n"); for(i=0;i...

壤塘县13018279798: 用C++怎么确定文件中二维数组的行列数 -
柳紫三七: 就把它当一维数组读进来.当知道行或列时,可以通过下标计算,得到它在一维中的位置.#include <stdio.h>#include <stdlib.h> main(){ FILE *fin; char namein[80]="a.txt"; // 假定文件名已知 int n=0,t,i; int *x; fin = fopen(namein,"r"); //打开...

壤塘县13018279798: C语言中,对于不知道长度的数组怎样输入... -
柳紫三七: 1、一维数组的定义、引用和初始化:定义一维数组的一般形式:类型名 数组名[常量表达式]. 2、一维数组程序举例:冒泡法. 3、得到结果进行输出. 4、二维数组常称为矩阵.把二维数组写成行列的排列形式,可以形象的理解二维数组的逻辑结构. 5、字符数组的定义,引用和初始化:C语言中没有字符串类型,字符串是存放在字符型数组中的. 6、字符数组综合举例.输出一个菱形.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网