在C语言中,数组作为参数,是怎样在函数之间传递的啊??

在C语言中,数组作为参数,是怎样在函数之间传递的啊??,第1张

数组作为参数是按地址传递的
数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送, 也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。

#include <stdioh>

void fun(int (p1)[3],int (p2)[3]);

int main()

{

int p1[3][3]={{7,8,9},{4,5,6},{1,2,3}} ;

int p2[3][3] = {0};

int i = 0, j = 0;

fun(p1,p2);

for(i = 0;i < 3;i++){

for(j = 0;j < 3;j++){

printf("%d ",((p2+i)+j)); 

}

printf("\n");

}     

return 0;

}

void fun(int (p1)[3],int (p2)[3])

{

int i = 0,j = 0;

for(i = 0;i < 3;i++){

for(j = 0;j < 3;j++){

(p2[j]+i) = (p1[i]+j);

}

}

}

扩展资料:

函数指针的声明方法为:

返回值类型 (  指针变量名) ([形参列表]);

其中,“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); / 声明一个函数 /

int (f) (int x); / 声明一个函数指针 /

f=func; / 将func函数的首地址赋给指针f /

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

参考资料:

百度百科-函数指针

在C语言中可以用二维数组作为实参或者形参。

1、函数中用二维数组作为形参,函数声明中可以指定所有维数的大小,也可以省略第1维的维数如:

     void f(int array[3][10]); //正确
     void f(int array[][10]);  //正确

上面的两种二维数组形参表示都是正确的。

2、函数中用二维数组作为形参,不能把第2维或者更高维的大小省略,如下面的定义是不合法的:

     void f(int array[][]); //错误

   因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的:

    void f(int array[3][]);  //错误

3、二维数组作为实参传递时,必须保证实参第2维的维数与形参第2维的维数相同,因为必须要保证形参和实参的数据类型一致。比如定义如下函数:

void f(int array[][10]);

可以将如下数组传递给函数f。

int a[2][10] = {1,2,3,4}; 
int b[4][10] = {1};

看你的代码。

你问题并不在数组传入。你函数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;
}

不是写法的问题,可能你对数组的具体含义还不太清楚哈。
一个一维数组的数组名是指向这个数组首地址的指针,比如:
int a[3]={1,2,3};
printf("%d",a);
输出:1
a就是指向这个数组的首地址的指针,当用:
int b;
b=a+1;//a地址加1,指向下一个元素
printf(%d",b);
输出:2
二维数组名是指向数组首行的指针,与一维类似,但区别也很大,具体的你去翻你的课本吧,没课本去百度百科。
在说函数,先说了,数组名其实就是指针,但a[2]这就是数值了,所以在申明函数的时候你可以这样申明(或定义):
static void DisplayBoard(char board[][3])
{printf("%c",board[0][0]);}
也可以这样申明(或定义):
static void DisplayBoard(char board)
{printf("%c",board[0][0]);}
这两种申明方式是等价的,都可以用下标法访问。
在调用的时候,函数要求的是输入数组,如果你用:
DisplayBoard(board[3][3]);
这是不行的,board[3][3]是一个数值,而不是一个数组,数组做参数时是将数组首地址传递给函数了,所以用数组名或者用指针都可以:
char a;
a=board
//下面两种效果是一样的
DisplayBoard(board);
DisplayBoard(a);

#include
void
main()
{
int
s[10]={1,2,3,4,5,6,7,8,9};
int
n;
printf("请输入需要插入到数组中的位置:");
scanf("%d",&n);
//比如说插入到第三个位置,即s[2]中,则输入3
int
num;
printf("请输入需要插入的数:");
scanf("%d",&num);
for
(int
i=10-1;i>=n;i--)
{
s[i]=s[i-1];
}
s[i]=num;
printf("插入之后的数组:\n");
for
(i=0;i<10;i++)
{
printf("%d
",s[i]);
}
printf("\n");
}


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

原文地址: https://outofmemory.cn/yw/13341439.html

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

发表评论

登录后才能评论

评论列表(0条)

保存