十万火急,关于函数中形参为数组的问题

十万火急,关于函数中形参为数组的问题,第1张

之所以会发生错误,是因为你没有弄清楚参数传递的机制,即传值调用不改变原参数的值。

如果你的函数参数为(int , int)时,当你调用create(a,len)时,系统会将数组a的起始地址的值(注:此时此值为NULL,不过此值为何并无影响,下面解释)压入参数栈。之后程序跳入create函数开始执行。

此时,系统创建了一个int 类型的临时变量,我们不妨就称其为ap。然后,系统从参数栈中找到压入的参数值(即前面提到的NULL值),并将其赋给ap。

也就是说,指针ap此时可以看做和传入的指针具有相同的值,即临时变量ap指向传入的数组的开头(其实也就是ap = NULL)。

之后,系统执行ap = new int[n]语句,在内存中申请一块新的区域,并将它的起始地址再次赋给ap。在执行这一步 *** 作后,原始指针a的值并未改变!被改变的仅仅是临时指针变量ap的值!

之后系统退出create函数,临时变量ap被销毁!而原始指针变量a的值依然为NULL!

而你将参数表改为(int &,int),则是利用了C++中的语法糖:引用。加入&号后,引用机制将使得传入的参数被自动取地址,这样就实现了传址调用。

这样,你在调用create(a,len)时,系统将指向数组a的指针的本身的地址压入参数栈,进入create函数后,系统将会隐性的创建一个临时变量(不妨称其为app),使他的值等于压入的地址。在执行ap = new int[n]这个语句时,引用机制隐性的完成了 (app) = new int[n]这步取值赋值 *** 作,由于app是指向数组a的指针的指针,这样就实际的改变了指针a的值,使其指向一块有意义的内存空间。

很简单的,数组作为函数参数传递的时候只要是数组名就可以了,因为数组名本身就是数组的首地址 给个程序看看

#include<stdioh>

#define N 3

int array[N][N];

void main()

{

//在主函数内声明被调函数

void convert(int array[][3]);

int i,j;

printf("输入数组:\n");

for(j=0;j<N;j++)

for(i=0;i<N;i++)

scanf("%d",&array[i][j]);

printf("\n");

for(j=0;j<N;j++)

{

for(i=0;i<N;i++)

printf("%d\t",array[i][j]);

printf("\n");

}

//调用矩阵转置函数

convert(array);

printf("\n");

for(i=0;i<N;i++)

{

for(j=0;j<N;j++)

printf("%d\t",array[i][j]);

printf("\n");

}

}

void convert(int array[][3])

{

int i,j,t;

for(i=0;i<N;i++)

for(j=0;j<N;j++)//设置数组中转置矩阵元素交换

{

t=array[i][j];

array[i][j]=array[j][i];

array[j][i]=t;

}

}

同形式参数型式有关。

形式参数 int array[],

int b[5] 作实际参数用, 只需写 b

#include <stdioh>

void reverse(int array[], int size) {

int i,t;

for (i=0;i<size/2;i++){

t = array[i];

array[i]=array[size-1-i];

array[size-1-i]=t;

}

}

main(){

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

int c[6]={1,2,3,4,5,6};

int i;

reverse(b,5);

reverse(c,6);

for (i=0;i<5;i++) printf("%d ",b[i]);

printf("\n");

for (i=0;i<6;i++) printf("%d ",c[i]);

return 0;

}

这个有点麻烦啊,我想到的只能这样,假设数据类型是int

int f(int arr)

{

// 干嘛干嘛

return arr;

}

不然不知道这个返回值该怎么声明,

这样的函数是用的时候有点问题,如果是动态数组,那就没问题,静态的化,有点麻烦,要对内存了解

由于function的参数是数组,那么传入参数也设置为数组,然后按照一般的传参方式传入即可。举个例子:

1、函数定义

function userfun(array){

var square = [];

for(k in array)

square[k] = array[k]array[k];

return square;

}

2、传参和调用

a = [1,2,3,4,5];

b = userfun(a);

alert(b);

3、结果显示

参数数组

就是函数调用中能使用可变数量的参数

示例

using System;

class Test

{

static void F(params int[] args) { // 这里就是参数数组params修饰的

ConsoleWrite("Array contains {0} elements:", argsLength);

foreach (int i in args)

ConsoleWrite(" {0}", i);

ConsoleWriteLine();

}

static void Main() {

int[] arr = {1, 2, 3};

F(arr);

F(10, 20, 30, 40);

F();

}

}

产生输出

Array contains 3 elements: 1 2 3

Array contains 4 elements: 10 20 30 40

Array contains 0 elements:

F 的第一次调用只是将数组 arr 作为值参数传递。F 的第二次调用自动创建一个具有给定元素值的四元素 int[] 并将该数组实例作为值参数传递。与此类似,F 的第三次调用创建一个零元素的 int[] 并将该实例作为值参数传递。

数组作为参数是按地址传递的

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

如果一个函数的目的是要产生一个新的数组,那么最好的做法是在调用函数前就生成好这个数组,然后把这个数组作为参数传给函数,在函数中修改这个数组的值

像你这种做法,在sum函数结束后,sth3数组就作为局部变量被释放了而且在main中,sum数组声明以后,sum就是一个常量了,又怎么能放在=左边呢

另外,sum函数的算法也错了

正确代码如下:

void Sum(int sth1[][3],int sth2[][3],int sth3[][3])

{

int i = 0;

int j =0;

do

{

sth3[i][j]=sth1[i][j]+sth2[i][j];

j++;

if(j==3)

}while(i<3);

}

int main(void)

{

int matrix1[3][3]={

,

,

};

int matrix2[3][3]={

,

,

,

};

int sum[3][3];

Sum(matrix1,matrix2,sum);

Display(sum);

return 0;

}

如果还没解决你的问题,可以加我百度HI账号。

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

原文地址:https://54852.com/langs/11671352.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存