精华内容
下载资源
问答
  • 向函数传递一维数组

    千次阅读 2013-11-16 16:16:27
    数组的存储空间很大, 如果能够把它作为参数传递函数, 那么就能发挥很大的作用了。...当函数中的某个参数是数组时,在参数名后加上一对中括号,比如 int a[],表示参数 a 是数组。下面我们就来看这样
    数组的存储空间很大,
    
    如果能够把它作为参数传递给函数,
    那么就能发挥很大的作用了。
    比如本来一个选出最大数的 max 函数只能在两个数或三个数里面选出一个最大的数字,如
    果我们把数组传递过去,
    它就能够在一堆数字中选出最大的数了,
    这大大提高了程序的效率。
    当函数中的某个参数是数组时,在参数名后加上一对中括号,比如 int a[],表示参数 a 是一
    个数组。
    下面我们就来看这样一个在一堆正数里面找一个最大数的程序:

    #include "iostream.h"
    int max(int a[],int size);//size 是数组的大小
    int main()
    {
    int number[]={2,45,12,6,23,98,13,3};
    cout <<max(number,sizeof(number)/sizeof(int)) <<endl;
    return 0;
    }
    int max(int a[],int size)
    {
    int max=0;
    for (int i=0;i<size;i++)
    {
    if (a[i]>max)
    max=a[i];
    }
    return max;
    }


    运行结果:
    98
    我们发现,在函数里使用数组也是比较方便的。但大家有没有考虑过一个问题,我们为
    什么不在函数里面用 sizeof 算出数组的大小,而非要在函数外面算好了,再作为参数传递给
    函数呢?在这里,我们就有必要讲一下数组作为参数传递给函数的原理了。
    一般来说,参数的传递是将实参的值赋给形参。然而对于数组来说却是一个例外,
    因为数组的数据太多了,
    将其一一赋值既麻烦又浪费空间,
    所以 数组作为参数传递给函数的
    只是数组首元素的地址,函数在需要用到后面元素时再按照这个地址和数组下标去查找。
    也就是说后面的元素根本没到函数里来,
    所以在函数里求不出数组的大小也就不足为奇了。
    - 69 -易学 C++
    所以,
    当一个函数的参数是一个数组时,
    我们必须注意要想办法让这个函数知道数组的大小。
    展开全文
  • 其实注意的点就是把一维数组和二维数组当作参数传递。 数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组的空间。 当用数组名作为实参调用函数,数组首地址指针就被传递函数中。 一维数组: ...

    其实注意的点就是把一维数组和二维数组当作参数传递

    数组作为函数实参时,只传递数组的地址(首地址),并不传递整个数组的空间。

    当用数组名作为实参调用函数,数组首地址指针就被传递到函数中。

    一维数组:

    在main函数之前声明时。

    这三种声明的方式都对。因为指针和数组的关系很密切,*y 就能代表这个数组首地址,

    漏了这种直接一个[]的也行。2333

    这种在书写函数的时候下面两种都行

     

     

    不过在书写函数的时候就得用指针来代替数组了。这是比较super的写法

    正常的写法:

     

    不过调用方法时传递的参数都是数组名

    ------------------------------------------------------------------------------------------------------------

    二维数组:一般数组里第一个参数不写,只写第二个参数

    正常写法:

    要玩花里胡哨的话:把数组里第一个参数先声明一下就行。和我之前写的

    差不多

     

     

     

     

     

     

    展开全文
  • 在C语言中,向函数传递参数只有一种形式——值传递。不管是传递一个整型变量,还是传递一个指针,函数得到的都只是实参的拷贝值。先定义一个一维整型数组: int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };首先明确...

    一维数组

    在C语言中,向函数传递参数只有一种形式——值传递。不管是传递一个整型变量,还是传递一个指针,函数得到的都只是实参的拷贝值

    先定义一个一维整型数组:

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

    首先明确一点:数组名和指针是两个不同的概念,尽管数组名在绝大部分情况下被隐式转换成指针使用。
    我们没办法真正地把数组传递给函数,我们只能传递一份指向数组起始位置的指针的拷贝

    函数原型:

    void func(int *a);
    void func(int a[]);

    在当前这个上下文环境中,二者等价。你可以使用任何一种声明,如果要说哪一种最准确,应该是第一种。因为实参实际上是个指针,而不是数组。

    这样我们就把指向数组首元素的指针的拷贝传递给了函数。在实际应用中,我们通常还会传递另一个参数,用来表示数组的长度:

    void func(int *a, int len);

    通过第二个参数,我们可以很方便地在函数内遍历这个数组:

    void func(int *a, int len) {
        int i = 0;
        while (i < len) {
            printf("%d ", a[i]);
            i++;
        }
    }
    
    func(a, 10); // 打印数组a的所有元素

    二维数组

    接下来是二维数组,传递二维数组参数有更多需要注意的点。
    先定义一个二维整型数组:

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

    我们实际上要向数组传递一个指向数组首元素的指针的拷贝,首先必须搞清楚数组名b的类型应该是:

    int (*)[3]

    数组名的类型取决于数组元素,数组b长度是2,每个元素是长度为3的整型数组,所以b的类型是上面那坨(如果这里有疑问可以看我的另一篇文章《彻底弄懂C语言数组名》)。
    如果上面的内容没有疑问,那么就来看函数原型:

    void func2(int (*p)[3]); // 两种都可以,第一种更准确
    void func2(int p[][3]);

    同样地,我们可以传递另外两个参数,分别表示行数和列数:

    void func2(int (*p)[3], int len_i, int len_j);

    但是请千万注意:写成二级指针是错误的!

    void func2(int **p); // 不可以这样~>_<~

    为什么不行呢?因为指向指针的指针和指向数组的指针是不同的。如果这样写,有可能你的程序能正确运行,但也有可能因为寻址错误导致程序崩溃哦!

    下面给出完整的例子:

    #include <stdio.h>
    
    void func2(int (*p)[3], int len_i, int len_j);
    
    int main() {
        int a[2][3] = { 
            {0, 1, 2}, 
            {3, 4, 5}
        };
    
        func2(a, 2, 3);
    
        return 0;
    }
    
    void func2(int (*p)[3], int len_i, int len_j) {
        int i, j;
        for (i = 0; i < len_i; i++) {
            for (j = 0; j < len_j; j++) {
                printf("%d ", p[i][j]);
            }
            printf("\n");
        }
    }

    这里写图片描述


    但是,不知道你有没有发现一个问题,我们必须在函数原型中指定第二维的大小,这意味着函数不能复用。为了向函数传递一个大小未知的数组,我将介绍两种技巧。

    第一种是通过void *指针接收一个数组,同时传递两个参数标记行和列,然后在函数内部将void *指针强制转换成二维数组。

    还有一种技巧叫做压扁数组(flattening the array),是通过一级指针遍历二维数组的方法。只要数组在内存中连续,这个技巧就可以用。我将在下一篇文章中详细介绍这个技巧。

    展开全文
  • /*向函数传递一维数组的例子:从键盘输入某班学生某门课程的成绩, (假设每班人数最多不超过40人),当输入成绩为负值时,表示输入结束 试编程计算其平均分,并输出实际输入的学生人数*/ #include<stdio.h> ...

    在这里插入图片描述

    /*向函数传递一维数组的例子:从键盘输入某班学生某门课程的成绩,
    (假设每班人数最多不超过40人),当输入成绩为负值时,表示输入结束 
    试编程计算其平均分,并输出实际输入的学生人数*/
    #include<stdio.h>
    #define N 40
    int average(int score[],int n);/*average()函数的原型*/
    int readscore(int score[]);/*readscore()函数原型*/ 
    main()
    {	int score[N],aver,n;
    	n=readscore(score);/*调用函数readscore()输入成绩,返回学生人数*/	
    	printf("总学生人数是:%d\n",n);
    	aver=average(score,n);/*调用函数average计算平均分,返回平均分*/ 
    	printf("平均分是:%d\n",aver);
    	return 0; 
    }
    /*函数功能:计算n个学生成绩的平均分*/
    int average(int score[],int n)/*average()函数定义*/
    {	int i,sum=0;
    	for(i=0;i<n;i++)
    	{	sum+=score[i];
    	}
    	return n>0?sum/n:-1;/*防止除0问题发生*/
     } 
    /*函数功能:输入学生某门课程成绩,当输入成绩为负值时,结束输入,返回学生人数*/
    int readscore(int score[])/*readscore()函数的定义*/
    {	int i=-1;/*i初始化为-1,循环体内增一后可保证数组下标从0开始*/
    	do{
    		i++;
    		printf("输入分数:");
    		scanf("%d",&score[i]); 
    	} while(score[i]>=0);/*输入负数时结束输入*/
    	return i;/*返回学生人数*/ 
     } 
     
    
    展开全文
  • 问题背景:从键盘输入某班学生某梦课程的成绩,(假设每班人数最多不超过40人,具体人数从键盘输入),试编程计算其平均分。.../*ave()函数原型*/ void readscore(int score[],int n);/*readscore函数原型*/ int m...
  • 向函数传递维数组

    千次阅读 2013-11-16 16:50:58
    这就像我们要让函数知道一维数组的大小一样,防止发生越界访问。 另一个就是我们必须让电脑知道这个二维数组 是怎样的一个表格,即必须告知数组的列数。 #include "iostream.h" #include "iomanip.h" void disp(in
  • 自定义函数传递一维数组

    千次阅读 2017-11-11 14:51:06
    一维数组函数中的传递 #include "stdafx.h" void displayArray(int *p, int n) { for (int i = 0; i; i++) { printf("%d\n", p[i]); // *(p+n) } } void mySwap(int *px, int *py) { *px = *px ^ *py; ...
  • C/C++函数传递维数组

    千次阅读 2020-11-20 10:38:31
    2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理) 函数参数传递二维数组的问题 将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由...
  • C语言如果给函数传递维数组作为参数 问题的产生 先看个传递二维数组的例子: #include <stdio.h> void foo(int a[][], int m, int n) { int i = 1; int j = 1; printf("a[%d][%d]=%d\n", i, j, a[i][j...
  • (1)由于二维数组名也是一个地址,但其为行地址,所以传递二维数组时,形参应为行指针,即指向一维数组中的指针,同样有指针变量和数组两种形式。 (2)(a)exit函数:功能为终止程序的执行,将控制归还操作系统...
  • 函数传递维数组方法

    千次阅读 2019-04-18 20:55:51
    二维数组这样定义的时候:int x[n][m]感觉就不再是一个真正意义上的数组了,因为没有办法通过头指针进行访问,传递的时候编译器报错没有这个函数,...这样的话,就按定义一维数组的方法进行定义,然后规定大小。 ...
  • 能否向函数传递一数组

    千次阅读 2017-07-14 17:04:13
    能否向函数传递一数组
  • * 需求:需要把若干个一维数组传给核函数 * 实现方法:在gpu生成一个一维的指针数组,每个元素指向一个普通一维数组。 * 把该指针数组的地址传递给核函数。 * 其实该指针数组充当二维数组的角色。 */ __global...
  • C语言函数传递维数组的方法

    千次阅读 2013-04-30 10:22:24
    c语言中经常需要通过函数传递维数组,有三种方法可以实现,如下: 方法, 形参给出第二维的长度。 例如: #include void func(int n, char str[ ][5] ) { int i; for(i = 0; i ; i++) printf("/...
  • 函数传递维数组指针

    千次阅读 2015-03-05 11:16:47
    很多时候,函数的形参很容易定义为指针的指针形式(如:int **number),这样可用来表示指向整型指针的指针,但我们传递的可是个二维数组,其指针该是指向整型数组的指针。这就是容易出现模糊的点。那如果形参形式...
  • C函数传递维数组

    2014-04-09 22:27:31
    方法: #include #include #define M 3 #define N 4 int get(int** a, int i, int j) { return *((int*)a+i*N+j); } int main() { int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int v;
  • 无法向函数传递一数组 int main() { char b[10] = “abcdefg”; fun(b[10]); return 0; } void fun(char a[10]) { int i = sizeof(a); char c = a[3]; } 如果数组 b 真正传递到函数...
  • 函数传递维数组的方法

    千次阅读 2014-07-17 17:53:19
    函数传递  方法
  • 一维数组----任何一维数组均可以作为函数的实参。形参被改写为指向数组第一个元素的指针, 因此,需要一个约定来提示数组的长度,可是是一个额外的参数,或者是一个能够标识越界位置的结束符。 二位数组----不...
  • 举例子: int data[3][4] ={ {1,2,3,4} , {5,6,7,8} , {9,10,11,12} };...data 是数组名,该数组有3个元素,第个元素本身又是数组,有4个int 值组成。 因此,data的类型是指向4个int组成的数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,208
精华内容 27,683
关键字:

向函数传递一维数组