cc++怎样向函数传递二维数组的参数?

cc++怎样向函数传递二维数组的参数?,第1张

c/c++可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

     void Func(int array[3][10]); 
     void Func(int array[][10]);

二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的: 

     void Func(int array[][]);

调用时把去掉,表示掉用这个数组的所有元素,数组的名称表示数组第一个元素的地址。
数组的定义可以写成:
int
table[]={1,2,3,}
或者table[3],不能写成table[],因为系统在定义数组时就给数组分配了地址,table[]没有确定元素的个数,不能分配地址空间。
但是作为形参,可以这样写,void
tab(int
table[])
,不知道为什么,呵呵

1、因为数组在内存中是一块连续的内存,只要将该数组的首地址传进去,当然就可以访问整个数组了。值得注意的是,由于只传了首地址,函数不知道数组的维数,所以还得把数组的维数传进去,那就可以完全 *** 作该数组了。
2、例:有一个函数声明:void fun( int aa[],int size );或者void fun( int pa,int size );
以上两种声明都一样。
调用上诉函数时:假设有 int ab[10];
fun( ab,10 )就可以了。

C语言如果给函数传递二维数组作为参数

先看一个传递二维数组的例子:

编译:

程序看着没有任何问题,但是编译器通不过,报错在处理二维数组参数a的时候,类型不兼容。

C语言里面对二维数组的存储是按照一维数组来处理的,二维数组按照行展开的方式按顺序存储,例如在上面的例子中:
二维数组a的定义:

它等同于一维数值的定义:

因为他们的空间存储分配一样的。

所以在利用二维数组作为参数传递时,必须指定二维数组的列数,否则函数无法勾画出二维数组的组织形式。只有有了列长度,通过下标a[i][j]时才能得到正确的下标地址,即:

我们改一下上面的额foo函数定义:

编译运行:

这下就正常了。

参数如上所列。

我们看到,函数的参数声明改成了:

这个声明的含义是:

不过此时还是需要指定二维数组的列长度,不然函数内部还是无法使用二维下标去访问数组:

编译:

原因同前面方法1一致,如果要访问二维数组,必须指定列的长度,否则无法计算出该元素的地址,a[i][j]=a [ (i-1)COLNUM + j ],如果没有COLNUM,那么这个地址无法计算出来。从形参的声明来说,a就是一个指针,指向一维数组的指针,而不是一个二维数组。

这里要注意的是指针的指针,和二维数组的差异;二维数组的地址是连续的,所有成员按顺序排序;而指针的指针只要求指针地址连续,而不要求指针的指针地址连续。

然后作为实参传递时,也不能直接使用a传递,因为类型不匹配,必须定义新的变量p,然后把a的值赋给p,再传递给foo函数。

函数原型 type fun (type (name)[size])\x0d\ \x0d\type是你要定义的类型,fun是函数名,name是在函数中二维数组的名字,\x0d\size是二维数组第2维的长度。\x0d\这样调用这个函数只需要把二维数组函数名传递就可以了。

看你的代码。

你问题并不在数组传入。你函数mymd5接收password数组,mymd5的password数组变量和外部函数的password地址相同,所以改变其中外部函数的数组也改变。

但你mymd5返回的数组decrypt,是局部变量,当mymd5调用结束,这个数组的内存空间就释放了。你接收了也是NULL。所以要用malloc或calloc申请动态内存。这样不会被释放。

我写了简单案例,你参考:

#include<stdioh>
#include<malloch>
#include<stringh>
char md(char a[]);//错误的数组返回
char md2(char a[]);//正确的数组返回
int main()
{
    char password[10]="123456789",decrypt=NULL;
    decrypt=md(password);
    printf("外部函数传递数组到子函数,子函数改变,外部函数也改变,password=%s\n",password);
    printf("错误返回方式:局部变量,外部函数接收失败,被自动释放,decrypt=%s\n",decrypt);
    decrypt=md2(password);
    printf("正确返回方式:动态申请,外部函数接收成功,不会被自动释放,decrypt=%s\n",decrypt);
    return 0;
}
char md(char password[])
{
    char decrypt[10]="";
    password[0]=0,strcpy(password,"abcdefghi");
    return decrypt;
}
char md2(char password[])
{
    char decrypt=(char )malloc(sizeof(char)10);
    if(!decrypt)
        return NULL;
    strcpy(decrypt,"");
    password[0]=0,strcpy(password,"abcdefghi");
    return decrypt;
}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13403305.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存