指向二维数组的指针作函数参数

小弟正学c,遇到难题了,求高人指点一二:我想在函数中调用整个二维数组,那应该如何定义函数参数呢?为什么定义为f(char**array)编译不行,而f((*array)[... 小弟正学c,遇到难题了,求高人指点一二:我想在函数中调用整个二维数组,那应该如何定义函数参数呢?为什么定义为f(char **array)编译不行,而f((*array)[])就可以了呢?它们不是一样的吗?如果写成f(a[][10])可不可以呢?另外,对于一个结构体,结构体名也是地址吗?
非常感谢,我主要是看到了这篇文章:http://zhidao.baidu.com/question/172709137.html?si=5
里面有这样一句:

如果要调用整个二维数组可以这样声明和调用:
fun(int **a,int b);

这句话应该是错的吧?我被搞糊涂了......
展开
 我来答
FrankHB1989
推荐于2018-04-18 · TA获得超过4.2万个赞
知道大有可为答主
回答量:4569
采纳率:100%
帮助的人:3060万
展开全部
首先要明确名称(name)和实体(entity)的区别——一个数组名是一个名称(C里面就是指标识符(identifier)),不是实体(例如这个数组名表示的一个占据运行期内存空间的数组对象)。名称用来指称(denote)实体(ISO C中没有明确地定义这个概念,但是可以参照ISO C++的定义,把对象、函数等作为实体的外延,区别作为名称的标识符),是通过语言实现指称语义的重要成分,但不是语义的组成部分(C语言编译后的目标程序中可以不储存这些名称来实现操作语义,也体现了这点)。实体本身即是指称语义的一部分,最终通过目标程序的指令流实现的操作语义来体现。地址在这里是指对象这一类实体的一种属性(attribute)。讨论名称的地址是没有意义的。(至于结构体名和地址有没有什么关系,具体后面再说。)数组名和地址看上去唯一有些关系的情形(也是最流行的误解之一)是字面地作为一个表达式,在左值上下文(例如声明、作为&操作符或sizeof操作符的操作数)以外的场合下,数组名表示的数组可以隐式转换为指向这个数组的首个元素的指针。对于参数列表,数组的第一维长度可以忽略,也是因为这种隐式转换起作用的关系。像void fun(int a[]);和void fuint a[N]);(N是编译期确定的常数,例如#define N 3)还有void fun(int* a)都是等价的。但第一维以外就没办法忽略。具体的原因是,数组的类型由元素类型和长度决定,在转换成对应指针类型时长度被忽略,但元素类型不变。而所谓的多维数组实际上都只是静态的嵌套数组。举个例子,声明int array[3][10];后,array的类型是元素类型int[10](这本身又是一个数组类型)的数组,长度为3——3和10是编译期确定的常数。在函数参数列表书写接受array的参数类型时,3是可以省略的,就算把3替换成其它正整数也没问题;另一种等价的方式是使用数组对应的指针类型:int (*)[10](注意这个类型中的10是元素类型决定的,在转换为指针时不会丢失)。int**和int(*)[10]是不兼容的类型,无法隐式转换,因此参数列表中不能互相替换,LZ引用的那个回答明显是胡扯。不过倒也不是LS“二维数组显然无论如何也变不成指针数组”,要显式地转换,像(int**)array之类,也是可以的,但明显混淆了类型的语义,不建议这样做。如果非要实现二维动态数组,可以用结构体对象中储存指针和长度的方式,用malloc等动态分配空间进行实现,这里长度是运行期可变的。如果要作为函数的参数,可以传递结构体对象的指针。
和数组一样,结构体是一类类型的统称,尽管结构体的实例有时候也可以简称为结构体,但还是要注意区别以免混淆。结构体名是类型名,表示一个类型,在C这样的纯粹的静态类型语言中自然和地址没有半毛钱关系。结构体的实例(结构体对象)的名称表示一个对象,是一片具名的连续的内存空间,可以说它的第一个字节的地址是这个对象的地址(因为大小在编译期根据结构体的类型完全地确定且在运行期不变,所以通过地址可以无歧义地表示这个对象在运行期的存储方式)。
====
[原创回答团]

参考资料: 原创

BlueWanderer
推荐于2016-10-03 · TA获得超过9209个赞
知道大有可为答主
回答量:5673
采纳率:83%
帮助的人:1963万
展开全部
参数表里char a[][10]和char (*a)[10]是一码事。char **是二级指针,你得传指针数组或者指针的指针进去,二维数组显然无论如何也变不成指针数组。

结构体逻辑上的,没有实体也不会占用内存。结构体的意义在于程序认为一个数据属于某个结构体类型的时候,就会根据结构体里规定的偏移位置获取数据里的成员,而这些偏移位置是常数,没必要用内存去存。 (不过你说结构体指的结构体变量的话,变量名代表的就是结构体数据的开始地址...姑且,这么说并不完全严谨。)

-----

那个答案里的类型都不匹配... 胡扯而已
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lhkda05
2010-11-27 · TA获得超过477个赞
知道答主
回答量:237
采纳率:0%
帮助的人:126万
展开全部
多维数组作参数时,只有第一维长度可以省略,否则无法确定传入参数的类型。
具体理由可以参考这里:。
如果要使用“真正的”多维数组,需要自行定义动态数组结构体,
例如:
typedef struct vector_
{
int* ptr;
int length;
} vector;
typedef struct vector2_
{
vector* ptr;
int length;
} vector2;
使用前再分配空间和进行赋值,然后传递vector2类型的指针即可。
====
[原创回答团]
希望对你有帮助
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友40b4752
2010-11-26 · 知道合伙人影视综艺行家
百度网友40b4752
知道合伙人影视综艺行家
采纳数:11393 获赞数:26311
本人对电影有一定的了解,资源量比较丰富,答题也可以说快准狠...虽然上传的那些证件几乎与我答题无关...

向TA提问 私信TA
展开全部
不好意思 不知道。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式