精华内容
下载资源
问答
  • 数组作为参数传入函数
    千次阅读
    2020-01-06 22:52:23

    == 1. 数组作为函数参数,是传首地址,

    2. 函数参数中的数组元素个数不能确定,数组仅在其域范围内可确定大小。==

    更多相关内容
  • c++中数组作为参数传入函数

    万次阅读 多人点赞 2019-04-15 19:23:38
    其中涉及了大量的数组运算,所以数组作为参数传入函数很重要,这里记录一下。 一维数组作为参数 1.我们除了要将数组名传入函数外,为了规范化,我们还要将数组的大小也要作为参数传入,而不是在函数内部去定义大小...

    前言:最近再看一个用c++写数组求逆矩阵的程序,那是相当的繁琐,但是很有趣。其中涉及了大量的数组运算,所以数组作为参数传入函数很重要,这里记录一下。


    一维数组作为参数

    1.我们除了要将数组名传入函数外,为了规范化,我们还要将数组的大小也要作为参数传入,而不是在函数内部去定义大小。即下面这种形式:

    int sum_arr (int att[] , int size)
    

    2.我们学习c的时候知道数组名就是首元素的地址,所以实际上传入函数的不是数组名,而是首元素的地址,所以除了上面的声明形式外,还可以写成

     int sum_arr (int *att , int size)
    

    第一种很好理解直观,第二种最符合实际。

    不管是哪种定义,使用函数时都是将数组名作为参数。比如 :

    sum_arr (Ss , 66);
    

    3.不要使用方括号表示法来传递长度

      int sum_arr (int att【size】)   //这是错的
    

    4.不管是哪种声明方式,如果在函数内部对传入的数组进行了修改,该数组本身的值也会改变,有点像引用,这是因为前面提到过传入的是地址,我们是直接对地址上的元素进行修改。

    5.为了防止在函数中修改了数组,可以使用const。
    方法: 在声明的形参前加入const

      int sum_arr (const int att[] , int size)
    

    6.在c++中,引入了一种新的方式,那就是使用数组区间。前面我们是将数组的首元素的地址和长度传入,这样就可以处理所有元素,当然我们也可以传入数组的首元素地址和末尾地址,参数就是【数组名,数组名+长度】,这样也可以处理所有元素,这就是数组区间。自然,我们也可以传入任意区间。

    比如下面的代码:

    int sum_arr(const int *begin,const int *end)
    {
        const int *pt;
        int total = 0;
    
        for(pt = begin ; pt != end ; pt++)
        {
            total = total + *pt;
        }
        return total;
    }
    
    
    int A[Size] = {0,1,2,3,4,5,6,7} ;
    int sum = sum_arr(A,A+8);
    

    二维数组作为参数

    与一维数组一样,有两种声明方式,但是区别是必须写出列数。
    第一种:

    int sum(int A[ ][ 4] , int size)  //不能写成 int sum(int A[ ][ ] , int size),必须将列数写进去,size的值是行数
    

    第一种:

    int sum(int (*A)[ 4] , int size)  //同样,必须将列数写进去,size的值是行数,而且必须要将*和数组名括起来。
    

    至于使用方法都是一样,sum(A,4)

    注意同样,不管是哪种声明方式,如果在函数内部对传入的数组进行了修改,该数组本身的值也会改变,有点像引用,这是因为前面提到过传入的是地址,我们是直接对地址上的元素进行修改。

    例子:用二维数组实现矩阵的转置:

    #include <iostream>
    
    using namespace std;
    const int hangshu = 2;
    const int lieshu = 4;
    
    
    
    void zhuanzhi(int A[][lieshu],int B[][hangshu],int B_hangshu)
    {
        for(int i = 0 ; i < B_hangshu  ; i++)
        {
            for(int j = 0 ; j < 2  ; j++)
                B[i][j] = A[j][i];
        }
    }
    
    
    void show(int A[][lieshu],int hangshu,int lieshu)
    {
        int i,j;
        for(i=0;i<hangshu;i++)
        {
            for(j=0;j<lieshu;j++)
                    cout << A[i][j] << " ";
            cout << endl;
        }
    }
    
    void show2(int (*B)[2],int hangshu,int lieshu)
    {
        int i,j;
        for(i=0;i<hangshu;i++)
        {
            for(j=0;j<lieshu;j++)
                    cout << B[i][j] << " ";
            cout << endl;
        }
    }
    
    void input(int A[][lieshu],int hangshu,int lieshu)
    {
        int i,j;
        for(i=0;i<hangshu;i++)
            for(j=0;j<lieshu;j++)
                cin >> A[i][j];
    }
    
    
    int main()
    {
        int A[hangshu][lieshu];//2*4
        int B[lieshu][hangshu];//4*2
        input(A,2,4);
        show(A,2,4);
        zhuanzhi(A,B,4);
        show2(B,4,2);
    
        return 0;
    }
    
    /****************************************************
    int sum_arr(const int *begin,const int *end)
    {
        const int *pt;
        int total = 0;
    
        for(pt = begin ; pt != end ; pt++)
        {
            total = total + *pt;
        }
        return total;
    }
    
    
    int A[Size] = {0,1,2,3,4,5,6,7} ;
    int sum = sum_arr(A,A+8);
    ***************************************************/
    

    另外,这个程序如果可以写进一个类里面更好

    展开全文
  • 首先我们要知道C++对于返回值的类型是有限制的——不能是数组。 我们来看看这条语句 int sum_arr(int arr[], int n)是否是正确的呢? 这条语句是正确的,但是不是说返回值不能是数组吗?形参为啥是int arr[]还可以...

    首先我们要知道C++对于返回值的类型是有限制的——不能是数组

    我们来看看这条语句 int sum_arr(int arr[], int n)是否是正确的呢?
    这条语句是正确的,但是不是说返回值不能是数组吗?形参为啥是int arr[]还可以呢?int arr[]真的是数组吗?

    arr实际上并不是一个数组,而是一个指针

    我们学过数组可以知道,将数组名视为指针,我们的数组名是数组第一个元素的地址,所以我们用的是它的地址,而不是数组。

    那有没有例外的情况呢?其实是有的。
    (1)数组声明使用数组名来标记存储的位置。
    (2)对数组名使用sizeof将得到整个数组的长度(以字节为单位)。
    (3)将地址运算符&用于数组名时,将返回整个数组的地址。

    所以我们可以认为:
    int sum = sum_arr(cookies, ArSize);
    int sum_arr(int *arr, int n);


    这两个语句是一样的,我们只是用int *arr 替换了int arr[]当且仅当用于函数头或函数原型中,int *arr 和 int arr[] 的含义才是相同的,它们都是意味着arr是一个int指针

    其中我们要认识两个重要的公式:
    arr[ i ] == *(arr + i)
    &arr[ i ] == arr + I
    记住,将指针(包括数组名)加1,实际上是加上了一个与指针指向的类型的长度(以字节为单位)相等的值。可以理解为指针偏移i个元素

    将数组作为参数意味着什么?
    int sum_arr(int arr[], int n),实际上并没有将数组内容传递给函数,而是数组的位置(地址)、包含的元素种类(类型)以及元素数目(n的变量)提交给函数

    传递常规常量时,函数将使用该变量的拷贝;但传递数组时,函数将使用与原来的数组。但这不违反C++按值传递的方法,sum_arr()还是传递了一个值,这个值被赋给一个新变量,但这个值是一个地址,而不是数组的内容。

    将数组名与指针对应,可将数组地址作为参数可以节省复制整个数组所需的时间和内存,但是使用原始数据增加了破坏数据的风险。我们可以采用const限定符提供解决这中问题。

    总结:

    1、我们可以将数组作为形参写进函数的,eg:int sum_arr(int arr[], int n),我们要正确了解,int arr[]不是数组,而是指针,我们只是写成了数组的形式,它本质还是指针
    2、为将数组类型和元素数量告诉数组处理函数,我们要用两个不同的参数来传递它们,eg:void fillArray(int arr[], int size)

    3、不要试图使用方括号表示法来传递数组长度,eg:void fillArray( int arr[size] )是错误的

    程序例子:

    #include <iostream>
    
    const int ArSize = 8;
    
    using namespace std;
    
    int sum_arr(int arr[], int n);
    
    int main(void)
    {
    	int cookies [ArSize] = {1,2,4,8,16,32,64,128};
    	cout << cookies << " = array address, " << endl;
    	cout << sizeof(cookies) << " = sizeof cookies " <<endl;
    	
    	int sum = sum_arr(cookies, ArSize);
    	cout << "Total cookies eaten: " << sum << endl;
    	sum = sum_arr(cookies, 3);
    	cout << "First three eaters ate " << sum << " cookies " << endl;
    	sum = sum_arr(cookies + 4, 4);
    	cout << "Last four eaters ate " << sum << " cookies." << endl;
    	
    	return 0;
    }
    
    int sum_arr(int arr[], int n)
    {
    	int total = 0;
    	cout << arr << " = arr, " << endl;
    	cout << sizeof(arr) << " = sizeof arr" << endl;
    	for (int i = 0;i < n ; i++)
    		total = total + arr[i];
    	return total;	
    }

    运行结果:

    0x9ff8fc = array address,
    32 = sizeof cookies
    0x9ff8fc = arr,
    4 = sizeof arr
    Total cookies eaten: 255
    0x9ff8fc = arr,
    4 = sizeof arr
    First three eaters ate 7 cookies
    0x9ff90c = arr,
    4 = sizeof arr
    Last four eaters ate 240 cookies.
    
    --------------------------------
    Process exited after 0.3507 seconds with return value 0
    请按任意键继续. . .
    

    展开全文
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • 二维数组作为参数传入函数(最好用的) 很多时候我都是直接通过传入一个 固定的数字来传递一个二维数组, 比如这样子定义函数 int fun(int a[][3],int n) 调用函数是 fun(a,n); 这样子调用的二维数组只能是固定...

    二维数组作为参数,传入函数(最好用的)

    很多时候我都是直接通过传入一个 固定的数字来传递一个二维数组,

    比如这样子定义函数 int fun(int a[][3],int n)

    调用函数是 fun(a,n);

    这样子调用的二维数组只能是固定已经知道的,不够灵活性。

    以下介绍一下通过指针直接随意设定的二维数组;

    *定义函数是 int fun(int *a,int n)

    调用函数也是直接 fun(a,n);

    不过有一点就是在定义数组的时候得分配一下空间以及定义的方式有些许不同,详细见下。

    #include<iostream>
    using namespace std;
    int fun(int **a,int n)  //在这里面操作二维数组也是正常的使用 a[i][j],不用通过 *(*(a+i)+j) 这样子的繁琐的指针地址和操作
    for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
     {
     cout<<a[i][j]<<" ";
          }
      cout<<endl;
         }
     }
     
     int main()
     {
         int n;
         cin>>n; 
         int *a[n];  
         for(int i=0;i<n;i++)   //给每行的数组分配一下空间 
         {    
             a[i]=new int [n];    
         }
         
         //下面初始化一下数组 
         int count=0;    
         for(int i=0;i<n;i++)
         {
             for(int j=0;j<n;j++)
             {
                 a[i][j]=count;
                 count++;
             }        
         }
      fun(a,n);//调用二维数组就可以直接用二维数组的起始地址 a 传入就可以了 
         
         return 0;
    }
    
    //上面如果不太懂的话可以对照一下下面的一维数组的指针传递,类似。
    #include<iostream>
    using namespace std;
    int fun1(int *a,int n)
    {
        for(int i=0;i<n;i++)
        {
            cout<<a[i]<<" ";
        }
    }
    int main()
    {
        int n;
        cin>>n;
        int *b;
        b=new int [n];
        //初始化
        for(int i=0;i<n;i++)
        {
            b[i]=i;
        }
        fun1(b,n);
        return 0;
    }
    

    不过要记得清楚动态内存。

    展开全文
  • 因工作需要,需要使用shell开发一些小工具,当使用数组作为函数参数时,发现只能传递数组的第一个元素,数组后面的元素不能传递到函数内。 #!/bin/bash function showArr(){ arr=$1 for i in ${arr[*]}; do echo...
  • 最近在关于数组的编程中发现这样一个问题:我想写一个函数模板以实现一个数组的排序,其中数组的大小是不确定的。我最开始的写法是: // A code block void sort(T arr[]) { int len; len = sizeof(arr) / ...
  • 对不起,可能我没表达清楚,我想问,数组作为参数传入函数为什么不是作为形式参数传入,请你看程序运行结果,如果数组作为形式参数传入函数,那么形式参数的值并不会影响原来main函数中的值,但是实际上,main...
  • } 结果运行效果截图: 运行没问题,这里解释一下如何把结构体数组作为参数传入函数,其实在C语言中,任何数组都可以用首地址加上数组长度的方式传入函数,结构体数组也是数组,同样可以以首地址加上数组长度的方式...
  • 函数通过数组作为参数 如果想通过一个一维数组作为函数的参数,就必须声明函数形式参数,使用以下三种方式与所有三个声明方法之一产生类似的...如下形式数组参数作为可变大小: void myFunction(int param[]) { . . . }
  • 函数的参数可以是数组,且数组作为参数传入时,参数中数组的第一维不需要填写长度,如果是二维,那么第二维需要填写长度,在实际调用时也只需填写数组名。最重要的是,数组作为参数时,在函数中对数组元素的修改就...
  • 数组作为函数参数 数组可以作为参数传递给方法。 public class Demo03 { public static void main(String[] args) { test01(new int[]{1,4,5,8,33}); } /** * @param array 数组作为参数 */ public ...
  • 如果需要将一个数组当作实参传入函数,则应把对应的形参声明成下面的形式:类型 名称[ ]因为,当把数组作为函数实参时,它会自动被转换为指针。所以上面的声明等同于下面的声明:类型 *名称当使用数组来声明函数...
  • 数组作为参数传递时可以,在定义的函数中可以改变主函数中数组的值。 #include<stdio.h> #include<string.h> void swap(char a[],char b[]) { char t[100]; strcpy(t,a);strcpy(a,b);strcpy(b,t); } ...
  • C语言中将二维数组作为参数传递给函数的方法

    千次阅读 多人点赞 2019-07-18 10:50:05
    *方法2: 指向一个有5个元素一维数组的指针 * *****************************************/ void print_b(double (*a)[5], int n, int m) { int i, j; for(i = 0; i ; i++) { for(j = 0; j ; j++) printf("%...
  • 数组作为函数参数函数的调用

    千次阅读 2021-02-02 19:01:41
    若将一个数组作为实际参数传递给函数,只需不带方括号的数组名即可 若数组a的定义为:int a[10]; 若要将数组a作为实参传递给被调用函数SumArr(), 则调用语句可写成:SumArr(a,10);
  • 测试数组作为参数传递给函数,在函数中访问和修改。并且,这表明C语言的数组作为参数传递给函数时,是作为引用方式传递的。 还有,在传递的时候,还需要把数组的大小也一并传递给函数。因为只传递数组函数,进而想...
  • #includevoidreplaceMax(intarr[],intvalue){intmax=arr[0];intindex=0;inti;for(i=1;i<5;i++){if(arr[i]>...//将数组中较大的数赋值给maxindex=i;//记录当前索引}}arr[index]=value;}intmai...
  • C语言中经常遇到需要将二维数组作为函数参数传递到函数中并进行访问或处理的操作,此处以打印二维数组为例,总结了二维数组作为函数参数的几种方式,包括形参定义、函数数组元素的访问及函数调用。需要注意的是,...
  • 用有参函数时需要提供实参,实参可以是常量,变量或者表达式,数组元素就相当于变量,因此数组元素可以用作函数实参,但是不能用作函数形参(因为在函数被调用时临时分配存储单元,不可能为一个数组单独分配存储单元...
  • 数组作为函数参数使用,改变实参

    千次阅读 2019-11-23 11:22:23
    //把数组作为函数参数时,这个函数中可以修改这个数组的值 Bonus_points(achievement,3,10); cout “原数组”[2]; Bchievementprint(achievement, 3); system(“pause”); return 0; }
  • JAVA中数组作为函数参数传递

    千次阅读 2020-04-05 12:43:23
    JAVA中数组作为函数参数传递 JAVA中数组作为函数参数传递: 在程序中,调用方法并且把数组的名称作为参数传递到方法中。 本质上是传递数组的地址值。 既然传递的是数组的地址,那么方法就可以通过数组的地址改变...
  • 1、静态二维数组 #include <iostream> using namespace std; void ces(int num[5][5]) //这样可以 //void ces(int num[][5]) //这样可以 //void ces(int num[5][]) //这样不可以 { for (int i = 0; i <...
  • 传递数组作为函数参数

    千次阅读 2019-02-25 17:19:54
    数组作为参数进行传递 &nbsp; 有两种传递方法,一种是...但是数组是个例外,因为数组的数据太多了,将其一一赋值既麻烦又浪费空间,所以数组作为参数传递给函数的只是数组首元素的地址,数据还是在内存里的...
  • C++数组作为参数传递给函数

    千次阅读 2018-02-28 10:05:10
    1.如果使用引用,需要在函数形参写出引用数组的长度。void bubblesort(int(&unsortarray)[10], const int &length) { for (int i = 0; i ; ++i) { for (int j = 0; j ; ++j) { if (unsortarr
  • #include <stdio.h>#include <stdlib.h>int maopao(int a[],int n);int main (){ int M,N,i,j; scanf("%d %d",&M,&N); while(M) { int a[N]; for(i=0;i<N;i++){ scanf("%d",&a[i])...
  • 一般来说,将二维数组传给函数时,不能省略第二维的长度,也就是说,必须像这样void fun(int arr[][6], int n)这样的话第二维就被固定死的。但有时,我们确实需要处理不同的二维数组,这里有一个巧妙的方法:考虑到...
  • python中怎么把数组作为函数的输入

    千次阅读 2021-03-06 07:04:36
    python中怎么把数组作为函数的输入我在学习abaqus基于python的二次开发,遇到了这样一个问题 Abaqus中有一个函数findAt(),函数的输入为findAt(A,B,C,D,.....),其中A B C D等均为点的坐标 当我把这些坐标放在一个...
  • 传递参数是二维数组 二维数组传参,函数形参的设计只能省略第一个[ ]的数字; 因为对于二维数组,可以不知道有多少行,但必须知道一行多少个元素; #include<iostream> using namespace std; void test(int...
  • 因为自己做算法题的时候遇到过,最开始的时候比较苦恼,...将实参的数组名强转为int*型,这样传递的就相当于一维数组名,函数形参要进一步传入行列的大小,以手工寻址将实参的数组名强转为int**型,那么函数形参可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 336,096
精华内容 134,438
关键字:

数组作为参数传入函数