精华内容
下载资源
问答
  • 函数参数为数组

    千次阅读 2020-03-05 18:02:09
    一维数组 函数定义 函数定义时有四种方式: 方式一: void testfunc(int a[], int size) 方式二: void testfunc(int* a, int size) 方式三: void testfunc(int a[10], int size) 方式四: template<class T&...

    一维数组

    函数定义

    函数定义时有四种方式:
    方式一:

    void testfunc(int a[], int size)
    

    方式二:

    void testfunc(int* a, int size)
    

    方式三:

    void testfunc(int a[10], int size)
    

    方式四:

    template<class T>
    void testfunc(T a, int size)
    

    方式五:

    template<class T>
    void testfunc(T& a, int size)
    

    前四种方式,在函数中,a的类型都是int*,sizeof(a)都是4,即一个指针的字节数;第三种方式中,[]中的数其实可以随便填,不会报错说超出数组范围,类型是int*,sizeof(a)是4,且第三种方式一般不要用,而应当将数组长度以参数传入。第四种方式是把实参赋给形参,创建了一个临时的形参对象;第五种方式是引用,故其类型和实参类型一样,是int [5](假设传入的实参是长度为5的int数组),sizeof(a)是5*4=20.
    以上所有定义方式中,在函数中对形参的数组进行修改,都会改变实参的数组。

    函数调用

    调用以数组为参数的函数时只有一种方式:

    testfunc(a, size)
    

    二维数组

    函数定义

    函数定义时有四种方式:
    方式一:

    void testfunc(int a[][3], int size0, int size1)
    

    方式二:

    void testfunc(int(*a)[3], int size0, int size1)
    

    方式三:

    template<class T>
    void testfunc(T a, int size0, int size1)
    

    方式四:

    template<class T>
    void testfunc(T& a, int size0, int size1)
    

    前三种方式,在函数中,a的类型都是int(*)[3],sizeof(a)都是4,即一个指针的字节数;第四种方式的类型是int [2][3】(假设传入的实参是长度为【2】【3】的int数组),sizeof(a)是2x3x4=24.
    注意,形参定义时一定要写列数,不用写行数。

    函数调用

    调用以数组为参数的函数时只有一种方式:

    testfunc(a, size0, size1)
    
    展开全文
  • C语言 函数参数为数组

    千次阅读 2015-04-19 11:26:48
    1.数组名可以作为函数实参和形参,传递的数组首元素的地址。这样两个数组就共占同一内存,形参数组中各元素值的改变必将引起实参的改变。 ...2.多维数组名做函数参数时,形参的定义: eg.int arr

    1.数组名可以作为函数实参和形参,传递的数组首元素的地址。这样两个数组就共占同一内存,形参数组中各元素值的改变必将引起实参的改变。

    eg.主函数中调用average(score,5);//其中score为数组的名称

    float average(float array[],int n) //n=5指定需要传递的元素个数。


    2.多维数组名做函数参数时,形参的定义:

    eg.int array[][10];或int array[3][10];

    但不能把第二维及其它高维的大小说明省略。也不能只指定第一维(行数)而省略第二维(列数)

    数组在内存中按行存放。

    展开全文
  • 众所周知,函数在传参数时会复制参数,但传指针时,只是复制了指针本身,而没有复制指针指向的值,所以可以通过传指针或引用来使函数内可以修改外部的值。那么,对于数组,会怎样? 上测试程序 #include&lt;...

    众所周知,函数在传参数时会复制参数,但传指针时,只是复制了指针本身,而没有复制指针指向的值,所以可以通过传指针或引用来使函数内可以修改外部的值。那么,对于数组,会怎样?

    上测试程序

    #include<iostream>
    #include<typeinfo>
    using namespace std;
    
    void func(int arr[]){
        arr[0]=1;
        
        cout<<"type of arr in func : "<<typeid(arr).name()<<endl;
        cout<<"address of arr in func : "<<arr<<endl;
    }
    
    int main(){
        int arr[10];
        arr[0]=0;
        
        func(arr);
        
        cout<<arr[0]<<endl;
        cout<<"type of arr outside : "<<typeid(arr).name()<<endl;
        cout<<"address of arr outside : "<<arr<<endl;
        return 0;
    }

    这段程序定义了一个参数为int数组并修改了这个数组索引为0处的值为1的函数,在主函数中调用了它,并打印相关的信息。

    输出:

    type of arr in func : Pi
    address of arr in func : 0x7ffd09a12cb0
    1
    type of arr outside : A10_i
    address of arr outside : 0x7ffd09a12cb0
    
    按回车键返回
    

    从输出可以看出,在主函数中,arr的类型为A10_i,即大小为10的 int 数组;而在func函数中,arr的类型为Pi,即 int 指针。这说明了,在函数传参数时,将数组转化为了对应的指针。arr的首地址都是0x7ffd09a12cb0,并且func函数中修改的arr[0]的值成功的影响到了主函数中的arr,这也说明了,函数参数传数组时并没有复制数组,而是传了数组首地址对应的指针。

    展开全文
  • 主要介绍了c++将数组名作为函数参数数组元素进行相应的运算,需要的朋友可以参考下
  • 1 数组作为参数 我们可以将数组作为参数,传入到函数中,其实就...就是用数组作为函数参数; 又如, [java] view plain copy public class ArrayPar { public static void printArray(int []

    1 数组作为参数

    我们可以将数组作为参数,传入到函数中,其实就像我们main函数中 public void main(String [] args){};就是用数组作为函数参数;

    又如,

    1. public class ArrayPar  
    2. {  
    3.     public static void printArray(int [] array)  
    4.     {  
    5.         for(int i=0;i<array.length;i++) 
    6.             System.out.print(array[i]+"  ");  
    7.     }  
    8. }  
    我们可以这样调用 ArrayPar.printt(new int[ ]{3,2, 5,67});调用数组

    这里的new int[ ]{3,2,5,67};他也是一种创建数组的方法,只是这种方法创建出来的数组是没有名字的,所以叫匿名数组。很多时候在只使用一次的时候可以使用匿名数组的方法法,类似的还有匿名类。

    Java uses pass-by-value to pass arguments to a method. There are important differences
    between passing the values of variables of primitive data types and passing arrays.
    ■ For an argument of a primitive type, the argument’s value is passed.
    ■ For an argument of an array type, the value of the argument is a reference to an array;
    this reference value is passed to the method. Semantically, it can be best described as
    pass-by-sharing, i.e., the array in the method is the same as the array being passed.
    So if you change the array in the method, you will see the change outside the
    method.

    java 使用值传参(pass_by_value)的方式来传递函数参数,只是值传递方式在处理原始数据类型参数与引用类型参数时候有不同,如果一个参数是原始数据类型,那么参数变量的值传递进去。如果是引用类型,是传进了引用变量的值(也就是说,只是将指向数据的引用的值给传进去了,也就是被调用的函数新建的空间放的是这个引用的值,那么也就是也指向了数组存在的内存),所以同样是值传递,引用类型的传入的当然是引用变量的值,指向了同一数组,那么函数内对数组进行的修改在函数退出后依旧是有效的。

    例子:

    1. public class ArrayPar  
    2. {  
    3.     public static void main(String [] args)  
    4.     {  
    5.         int x=1;  
    6.         int y[]={1,2,3};  
    7.         change(x,y);  
    8.         System.out.println("x="+x+",y[0]="+y[0]);  
    9.     }  
    10.     public static void change(int num,int [] array)  
    11.     {  
    12.         num=100;  
    13.         array[0]=100;  
    14.     }  
    15. }  

    图形表示:


    这里同时注意一下,当我们用new 以及malloc这些的内存空间是在堆上heap,而像我们被调用的函数中使用的这些变量等在栈上。在调用changes时候,x的值被传入,在被调用的函数中重新开辟一个空间来放这个基本数据类型参数,但是int [ ] y ,将y传入其实就是传入了引用,在被调用的函数的栈上只会开辟一个空间来存放这个引用,所以被调用的函数与调用者 中两个引用指向堆上同一块内存。


    2 数组做为函数返回值

    1. public static<span style="color:#ff0000;"int []</span> reverse(int [] array)  
    2. {  
    3.     int [] result=new int[array.length]  
    4.     for(int i=0;i<array.length;i++)  
    5.     {  
    6.         result[i]=array[lenght-i];  
    7.     }  
    8.     return result;
    9. }  
    在将数组作为函数返回值时候如上红色标出的,就是在函数名字前加上返回值类型是int [ ] 表示返回一个int型数组,在函数体内最后返回是result这样的函数引用。


    Case Study: Counting the Occurrences of Each Letter

    write a program to count the occurrences of each letter in an random array of  lower  characters.

    那么我们可以怎么做呢?

    1)首先是要产生一个随机char数组  creatArray();(是否记得前边说过产生[a,a+b)之间的一个随机数 为  a+Math.random()*b,是否记得我们创建过获取任意字符的一个类?)

    2) 创建一个数组 int [ ] count,长度26,准备来存放各个字母的计数

    3)对数组进行循环 , 每读取一个字母ch,则 count[ch-'a']++;

    1. class RandomChar  
    2. {  
    3.     public static char getRandomChar(char ch1,char ch2)  
    4.     {  
    5.         return (char)(ch1+Math.random()*(ch2-ch1+1));  
    6.     }  
    7.     public static char getLowerCaseLetter()  
    8.     {  
    9.         return getRandomChar('a','z');  
    10.     }  
    11.     public static char getUpperCaseLetter()  
    12.     {  
    13.         return getRandomChar('A','Z');  
    14.     }  
    15.     public static char getDigitalLetter()  
    16.     {  
    17.         return getRandomChar('0','9');  
    18.     }  
    19.     public static char getRandomLetter()  
    20.     {  
    21.         return getRandomChar('\u0000','\uFFFF');  
    22.     }  
    23. }  
    24. public class CountOccur  
    25. {  
    26.     public static void main(String [] args)  
    27.     {  
    28.          char [] array=CreateArray();  
    29.          int [] count = new int[26];  
    30.          for(int i=0;i<array.length;i++)  
    31.          {  
    32.              count[array[i]-'a']++;  
    33.          }  
    34.          for(int i=0;i<count.length;i++)  
    35.          {  
    36.             System.out.print((char)(i+'a')+": "+count[i]+"    ");  
    37.             if((i+1)%10==0) System.out.println();  
    38.          }  
    39.            
    40.            
    41.     }  
    42.     //产生一个100个元素的小写随机数组  
    43.     public static char[] CreateArray()  
    44.     {  
    45.         char [] a=new char[100];  
    46.         for(int i=0;i<a.length;i++)  
    47.         {  
    48.             a[i]=RandomChar.getLowerCaseLetter();  
    49.         }  
    50.         return a;  
    51.     }  
    52. }  



    3 可变长度参数列表

    You can pass a variable number of arguments of the same type to a method. The parameter in
    the method is declared as follows:
    typeName... parameterName
    In the method declaration, you specify the type followed by an ellipsis Only one vari-
    able-length parameter may be specified in a method, and this parameter must be the last para-
    meter. Any regular parameters must precede it.
    Java treats a variable-length parameter as an array. You can pass an array or a variable
    number of arguments to a variable-length parameter. When invoking a method with a variable
    number of arguments,
    Java creates an array and passes the arguments to it

    我们可以传递类型相同,但个数可以变化的参数到函数中,如果有这个需求的话,这时候我们只需要在形式参数中使用 typename...parameterName就可以达到这个目的,要注意,在这里声明的该变长参数必须是最后一个参数,任何常规参数必须在他之前,也就是说你可以有 MethodName(char b, double c, int ... nums) 这样的形式即int ... nums必须在最后一个位置,你不能将int ... nums 声明在参数参数列表的非最后位置。

    java将可变长参数当做数组对待。可以将一个数组或者可的参数个数传递给该参数(注意,我们这里说该参数就是 typeName ... parameterName这整个结构),无论哪种形式,java会创建一个数组并把参数传给他,注意这里体会原文说的When invoking a method with a variable
    number of arguments, java Create an array and passes the arguments to it
    ,也就是说,如果你是传入几个变长的变量,那么在调用时候java先将创建一个数组来装这几个实际参数,然后再执行调用的函数,如果本身我们传入一个数组,其实他并不会创建一个新的数组来装,还是一样像上面指向了已经分配的数组空间,所以在被调用的函数中对数组的改变在退出时候还是有效的(这是我用例子试了下体会到的)

    1. public class VariablePar  
    2. {  
    3.     public static void main(String [] args)  
    4.     {  
    5.         int array[]={1,4,7,2,0};  
    6.         System.out.println("max="+findMax(array));  
    7.         ifChange(array);  
    8.         System.out.println("array[0]="+array[0]);  
    9.         ifChange(1,45,33);  
    10.     }  
    11.     public static int findMax(int ... nums)  
    12.     {  
    13.         if(nums.length==0)   
    14.         {  
    15.             System.out.println("No argumment passed");  
    16.             return -1;  
    17.         }  
    18.         int max=nums[0];  
    19.         for(int i=1;i<nums.length;i++)  
    20.         {  
    21.             if(max<nums[i]) max=nums[i];  
    22.         }  
    23.         return max;  
    24.     }  
    25.     //测试这里究竟是新创建一个数组还是相当于把引用传进来而已  
    26.     public static void ifChange(int ... nums)  
    27.     {  
    28.         nums[0]=100;  
    29.     }  
    30. }  
    这里,我们从findMax中看到,他不用先说明 什么就可以直接使用nums.lenght 说明确实java是完全将这类型的参数当做一个数组来处理了,二在ifChange中,我们看到输出的是array[0]=100,说明我们在调用ifChange(array)时候并不是重新创建一个新的数组,而是还是一样像前边的传入了引用,被调用者还是指向了相同的数组空间。但是在ifChage(1,45,33)这个调用时候,java就会先new int[ ]{1,45,33} 这样,然后形参nums再指向它,其实这样返回后应该就不会改变了1的值吧?
    展开全文
  • 作为函数参数数组

    千次阅读 2011-08-03 11:36:06
    当一个数组名作为参数传递给一个函数时会发生什么情况呢? 已知:数组名的值 == 指向数组第一个元素的指针。 此时,传递给函数的,是一份该指针的copy(这里注意,后面讲解)。函数如果执行了下标引用,实际上是对这...
  • 本文用简单的例子说明了C语言中数组函数参数,数组名a与&a区别,数组名a的"数据类型",以及编译器的不同,相应指针所占字节的不同导致程序的细微差别。
  • 本文介绍PowerShell自定义函数时,可以使用数组来传递多个参数数组传递参数时,参数个数本身无法限制,PowerShell函数提供了一个方法来限制数组参数的个数。 PowerShell函数可以接受数组作为输入参数。而且不...
  • 如果数组A在函数外定义,并且作参数传入函数,怎么在函数里求其长度?——没法求,一般我们会再多传入一个参数记录长度 动态数组,(1)用new创建的动态数组参数时,在函数里同样也不能求长度,因此一般我们也会...
  • 1.数组元素作为函数参数进行传递的时候,只要和数组类型和函数的形参一致既可以 2.数组名作为函数参数的时候进行传递的是数组的首地址,所以进行的传递是只是地址的传送,形参和实参数组的长度可以不相同,在参数...
  • var data = [1, [2, [ [3, 4], 5], 6]]; function flat(data, result) { var i, d, len; for (i = 0, len = data.length; i < len; ++i) { d = data[i]; if (typeof d === 'number'...
  • 我们先看看下面一段代码:直接使用数组,即StreamConfigTable数组作为bind函数参数,...大家知道,数组名作为函数参数时候,实际退化一个指针。 ReturnStatus CServiceEngine::SaveStreamC
  • 编译器总是要为函数的每一个参数制作临时副本,指针参数p的副本是_p,编译器使_p=p.如果函数体内的程序修改了_p的内容,就导致参数p的内容做相应的修改。这就是指针可以作为输出参数的原因。在例子中,_p申请了新的...
  • JavaScript函数及其参数数组简介

    千次阅读 2017-03-09 14:15:21
    1 Js函数可以传入不同的参数 ...2 Js函数返回值,js函数可以将运行的结果返回,函数可以视一个黑盒子,使用参数输入数据后产生所需的运行结果 function one2N(intnumber){ var intTotal = 0; for(var i=
  • 函数模板的数组参数

    千次阅读 2013-12-13 17:17:10
    什么函数模板 数组参数前一定要加&,如果不加&,则编译不通过? 而普通函数数组参数前面随便加不加&  #include  using namespace std;    template  void func(int (&array)[m]) {    } ...
  • 指针数组 首先从名字就可以知道这是一个数组,是存放指针的数组。 先看几种指针数组: int * 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
  • 函数参数数组

    千次阅读 2016-01-03 21:29:05
    还是像C++那样用它,居然甚至没有用过参数数组的情况,调试代码,有个异常一直未找到原因,后来自己查看调试,发现因为参数数组,后面的操作导致原值被改变,Java的函数中的参数,除基本类型是值传递外,数组和...
  • 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
  • 因为函数里调用数组数组定义在主程序里,通过参数传入,所以这个数组还是主程序的数组,所以不需要重新分配是不是?怎么实现调用函数数组和原来的数组分开来存储?
  • 数组函数调用
  • 数组函数参数:将数组逆序排列

    千次阅读 2017-07-18 19:22:04
    数组作为函数参数的时候,没有办法通过指针来获取数组长度,数组长度要作为参数传递给函数。 在函数定义中 int a[10] 这样的形参定义方式会被转化int * a不管是int a[10]还是int a[],都不会创建出一个数组,...
  • 数组作为函数参数

    千次阅读 2018-02-03 21:57:55
    数组作为函数参数 数组元素的作用与变量相当,一般来说,凡是变量可以出现的地方,都可以用数组元素代替。因此,数组元素也可以用作函数实参,其用法与变量相同,向形参传递数组元素的值。此外,数组名也可以作实参...
  • c函数传递结构体数组

    千次阅读 多人点赞 2019-08-23 16:35:25
    结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。(结构体变量传递给函数与基本变量传递给函数类似,可参考c函数传值调用和引用调用) ...
  • C语言自定义函数如何返回数组

    千次阅读 2020-07-05 13:48:40
    C语言自定义函数如何返回数组 使用 C 语言,在 main() 函数中调用了一个自定义的函数,想要从函数中获取其运行产生的...1、将数组定义全局变量; 2、使用malloc在堆区开辟动态空间; 3、在调用函数时传入数组地址。 -
  • 可能很多初学者对C语言中(C++类似),数组作为参数传递,和一个函数如何返回一个数组这类问题很迷惑,因为这里面涉及到指针问题,而初学者对指针了解甚少,更别说使用了。我也是刚刚需要实现一个简单算法才用到这...
  • Shell 向函数数组参数和返回数组

    千次阅读 2020-08-11 23:04:13
    如果将数组变量作为函数参数函数只会取数组变量的第一个值 testArray(){ echo "函数入参:$@" } myarray=(1 2 3 4) echo "原始数据:${myarray[*]}" testArray $myarray ![结果]...
  • (arr)" /> function check(arr){ //函数体 } arr是个数组,我怎么把自己定义的arr传进去呢
  • 函数的传入参数数组时 我们看下面一段代码 void test1(int arr[]){ int len = sizeof(arr) / sizeof(arr[0]); printf("test1.len=%d\n", len); } int main(){ int arr[5] = { 1, 2, 3, 4, 5 }; int len ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,166,971
精华内容 466,788
关键字:

函数参数为数组