精华内容
下载资源
问答
  • c语言 向函数传递数组

    千次阅读 2020-04-11 19:23:43
    可以定义一个能接受数组作为函数参数的函数,然后调用这个函数时,可以将一个实际的数组传递给它。 数组作为函数参数时,其定义方式有下列三种: /*函数名param后跟一个空的[],说明param可以接受一个数组*/ void ...

    可以定义一个能接受数组作为函数参数的函数,然后调用这个函数时,可以将一个实际的数组传递给它。

    数组作为函数参数时,其定义方式有下列三种:

    /*函数名param后跟一个空的[],说明param可以接受一个数组*/
    void myFunction(int param[]) {
       /*函数体 代码*/ 
    }
    /*函数名param后跟一个非空的[size],说明param可以接受一个大小为size的数组*/
    void myFunction(int param[]) {
       /*函数体 代码*/ 
    }
    /*函数名param前有一个*,说明param可以接受一个数组*/
    void myFunction(int *param) {
       /*函数体 代码*/ 
    }
    

    上述3个函数中,实际上上面2个函数都会被编译器转化为第3个函数,也就是说“数组作为函数的形参”实际上是一个指针类型的形参,即将来可以接受一个数组名表示的数组的起始地址!而并不是将一个数组的所有元素传给一个函数,仅仅传递的是一个小小的指针变量。

    比如,我们可定义下面的函数,第一个参数表示可以接受一个传入的数组

    double getAverage(int arr[], int size) {
    
       int i;
       double avg;
       double sum = 0;
    
       for (i = 0; i < size; ++i) {
          sum += arr[i];
       }
    
       avg = sum / size;
    
       return avg;
    }
    

    然后我们可以调用这个数组:

    #include <stdio.h>  
    /* 函数声明,表示存在这种格式的函数getAverage, 其第一个参数可以是一个int型数组,第二个参数是这个数组的大小 */
    double getAverage(int arr[], int size);
    
    int main () {
    
       /* 5个元素的int整型数组 */
       int balance[5] = {1000, 2, 3, 17, 50};
       double avg;
    
       /* 将数组名(实际是数组对应内存块的起始地址)传给getAverage函数 */
       avg = getAverage( balance, 5 ) ;
     
       /* 输出getAverage的返回值 */
       printf( "Average value is: %f ", avg );
        
       return 0;
    }
    

    也可以传递多维数组(如二维数组)给函数,在定义接受这种多维数组的函数参数时,和接受一维数组的函数参数一样,其第一维的大小也可以不指定。同样,如果我们省略第一维对应的方括号[],则要在参数名前加一个‘’。 并用圆括号括起来 “(参数名)”。

    #include <stdio.h> 
    #include <stdlib.h>  
    const int ROW = 2;
    const int COLUMN = 3;
    
    /*这2个函数的定义在main函数的调用语句后面,所以要先声明(说明)函数的规范*/
    void fill_array(int (*pm)[COLUMN],int row);
    void display(int m[][COLUMN],int row);
     
    int main()
    {
        int i,j;
        int m[ROW][COLUMN];
     
        /* 修改数组元素的值 */
        fill_array(m,ROW);
     
        /* 显示数组的元素 */
        display(m,ROW);
     
        return 0;
    }
     
    void fill_array(int (*pm)[COLUMN],int row)
    {
     
        int i,j;
        printf("Please fill the array's content:\n");
        /* 修改数组元素的值 */
        for(i = 0; i < row; i++)
        {
            for(j = 0; j < COLUMN; j++)
            {
                printf("\nm[%d][%d]:",i,j);
                scanf("%d",&pm[i][j]);
            }
        }
     
    }
     
    void display(int m[][COLUMN],int row)
    {
        int i,j;
        /* 显示数组的元素 */
        printf("Array's content:\n");
     
        for(i = 0; i < row; i++)
        {
            for(j = 0; j < COLUMN; j++)
            {
                printf("%d\t",m[i][j]);
            }
            printf("\n");
        }
     
    }
    

    执行程序后的输出:

    Please fill the array's content:
     
    m[0][0]:1
     
    m[0][1]:2
     
    m[0][2]:3
     
    m[1][0]:4
     
    m[1][1]:5
     
    m[1][2]:6
    Array's content:
    1       2       3
    4       5       6
    
    展开全文
  • C语言自定义函数返回数组的方法(图文详解)最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下:直接返回str数组名(注意不需要加...

    a200206c9a6cd31b8a15f9447c29de42.png

    C语言自定义函数返回数组的方法(图文详解)

    最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?

    能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下:

    bf093525c685920214c5d0b60beca8ca.png

    直接返回str数组名(注意不需要加&,还有好多同学犯这个错)

    但事实上,运行结果并非正常,我们尝试在调用函数中输出,可以看到结果并非是原来内容(当然你的电脑输出可能还不是这个样子)

    如下:

    ad96971d905d3c0bcac72b170218b505.png

    原因大家可以从str的属性入手,str本身是一个自定义函数中的局部变量,是一个数组有一百个字节,它的生命周期当然也随着它所在的函数一起,正所谓“一招天子一朝臣”,随着fun函数调用的结束,其中的各种局部变量也将被系统收回,理所当然的str数组这一百个字节也将被收回,所以”Hello www.dotcpp.com”这串字符串也就灰飞烟灭了!自然你在main函数里再输出肯定已经不是原来的内容了!

    怎么样,可以理解吧!

    不过,还没有结束,依然有同学继续问,可为什么我换成下面这种写法就可以了呢?

    如下图:

    5495abef55320314aecebee4d3253282.png

    答曰:这种写法情况下,str虽也属于是局部变量,但不是一个数组,而是一个指针,只有四个字节,存的是在常量区的字符串” Hello www.dotcpp.com”,但请注意,这个字符串在常量区,而不属于fun函数里的部分,全程序都可读,所以return之后依旧存在,返回的是str里的值,也就是字符串“Hello www.dotcpp.com”的首地址,是一个数,其实相当于把这个字符串的地址在str手里通过返回值转交到p里。

    也可以打个比方:之前只有fun函数知道这个字符串,但现在已经马上不行了,临终前,交代:“我快不行了,赶紧把‘Hello www.dotcpp.com’的藏宝地址(字符串首地址)转交到main函数里!”

    然后就return 快马加鞭的返回到main函数手里了!随后消失…

    而后,main函数获得之后,你们也就知道了…

    这样讲,大家能理解吗?

    后期C语言逆向分析部分,也会有涉及到此处的原理,大家可以再深入学习理解。

    同时,下篇我们将为大家讲解如何实现自定义函数的数组传递问题!

    通过上一篇的讲解,相信大家已经明白直接的return数组的问题以及原因了,今天我们将详细为大家讲解在函数中返回数组的常见办法。

    此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,那么一般来说,总结有以下三种:

    1、直接使用全局变量:这种方法最方便,但此方法打破了函数间的通信及封装的思想,所以不推荐使用,不在今天讨论范围之内。

    2、通过堆区动态开辟内存解决:C语言中,我们通常用malloc来在堆区动态开辟内存,利用堆区“现用现开辟,用完手动收回”特点,实现灵活管理。是实际开发中的常用办法,也是我们今天的主要内容。

    3、由调用方传入数组指针:此种方法不需要函数返回地址,而是在调用时直接 传入数组地址,委托被调用方进行操作,由于此局部变量属于调用方本身,故即便被调用方结束内存释放,也不会被影响到该数组。

    下面逐个实验,对于第二种方法,由于动态开辟内存在堆区,堆区不想上一讲中局部变量在栈区存储,系统根据它的生命周期自动收回,而是手动开辟,手动释放,这样就可以完全规避问题,例子与效果见下图:

    需要注意的是:记得用完free掉,防止内存泄露!

    711f53afd46063d2330d95af358e479e.png

    第三种方法:虽然没有在函数中返回数组,但也可以解决数组通信问题,主要思路就是调用方中定义数组,然后将地址传入,由于该内存属于调用方,而非被调用方,故被调用方在调用结束后释放掉内存也无所谓。例子程序及效果如下:

    9cda53ebd77f6c60f308727f4f1dc186.png

    关于数组使用传递的总结,大体如上,大家有任何问题和疑问还可以联系我们!

    感谢大家的阅读,希望大家收益多多。

    推荐教程:《C语言》

    展开全文
  • C语言函数返回数组

    千次阅读 2018-02-04 21:48:41
    C语言函数能否输入或返回一个数组? 可以的,但大多数方式都是说将数组的首地址作参数输入,或是指针函数返回一个数组的首地址。而这种方式并非真正意义上的“输入”或“输出”。 参数是一个新的量被附了参考量...

    C语言,函数能否输入或返回一个数组?

    可以的,但大多数方式都是说将数组的首地址作参数输入,或是指针函数返回一个数组的首地址。而这种方式并非真正意义上的“输入”或“输出”。

    参数是一个新的量被附了参考量的值,无论函数内部如何改变这个参数,都不会对原参考量造成影响。返回值亦是如此。因为如果用传入指针的方式,显然函数内部改动数组任意一个元素都会直接改写原数组。故不能说这种方式是数组输入。

    函数可以具有参数和返回值,而参数和返回值本质上只是“一串具有特定储存位置和长度的数据”而已。

    是的,仅仅具有“储存位置”和“长度”就足够了,跟它的数据类型没有任何关系。
    我们在写代码时会十分注意数据类型,而在编译后机器运行时,一切数据都是一串bin在内存特定区域的特定排列。
    例如:“char fun1()”“short fun2()”“long fun3()”这几个函数有什么区别呢?
    也许看上去我们会直观的说:fun1返回值为char型,fun2返回值为short型,fun3()返回值为long型……
    这没错,但这是编译以前的说法。
    在机器看来,它们的区别是:fun1返回1Byte,fun2返回返回2Byte,fun3()返回返回4Byte。
    那么“signed …”和“unsigned …”(大小相同)岂不是等效了吗?
    有区别,那是因为编译的时候编译器会对这些情况进行自动处理,毕竟编译器对数据类型还是比较敏感的,而运行时,它们的确是等效的(1Byte)。
    简单来说,“数据类型=数据长度+处理方式”,编译器关心的是处理方式,而机器运行仅仅关心数据长度。

    言归正传,怎么让一个函数返回一个“完整的数组”呢?(并不是返回首地址)

    “数据类型=数据长度+处理方式”。

    参数、返回值,仅仅有地址和数据长度就足够了,我们并不关心它的处理方式,因为返回值传递过程不需要进行数据处理。

    但怎么去描述一个数据(返回值)的长度呢?数据类型并不重要,可它却是描述数据长度的唯一方式。我们要确定一个长度,就要用一个类型来描述它……把整个数组当返回值,必然面临的问题是:返回值的长度与数组相同,数组可以很长,而可供我们选择、用来描述长度的数据类型(char,short,long,long long…)又很有限……很无解不是吗?

    别忘了还有“构造类型”。结构体这东西一般用的不多,但关键时刻它的用法花样不少。下面附一串代码:

     

    #include<stdio.h>

     

    typedef

    struct

    {

    char x[16];

    }

    newtype;

     

    newtype fun(void)

    {

    char str[16]="Hello world!\n";

    return *(newtype*)str;

    }

     

    void main(void)

    {

    char buf[16];

    *(newtype*)buf=fun();

    printf("输出结果:%s",buf);

    }

     

    可以试验一下,程序输出了Hello world!”。

    数组原本是空的,后来却能输出Hello world!”,我们知道buf[16]是一个静态数组,它的首地址buf是一个地址常量不能改变,那么唯一的解释就是buf[16]得到了fun函数内部完整的数组返回值,而不是得到首地址。

    原理如下:我们构造了一个参考类型newtype,这个类型的长度是自定的16再用这个类型来定义fun函数,那么函数的返回值长度自然就是16Byte,也就是数组长度了接下来把要返回的数组首地址强制转换成newtype指针(地址)型,再取这个指针的目标值作返回值,自然也就带回了数组中的所有(16个)元素同理,数组buf[16]接收这个返回值时也要进行同样的转换;完成。

    newtype这个构造类型我们从始至终也没有拿它定义任何变量,仅仅是给后续的数据传递提供了一个长度参考,故称作“参考类型”,它和那几个转换看似麻烦,其实就是欺骗一下编译器而已,这样操作的运行效率实际上是最高的。

    展开全文
  • 题目:定义一个函数,使用二维数组作为传入参数,在主函数中输入4×4的二维数组,调用已定义的函数,把该矩阵传入,在主函数中输出结果。函数功能:使二维数组中两条对角线上的元素均为1,其余元素均为0。 解: int ...

    题目:定义一个函数,使用二维数组作为传入参数,在主函数中输入4×4的二维数组,调用已定义的函数,把该矩阵传入,在主函数中输出结果。函数功能:使二维数组中两条对角线上的元素均为1,其余元素均为0。

    解:

    #include <stdio.h>
    #include <stdlib.h>
    int diagonal_assignment(int a[4][4])
    {
    	int i, j;
    	for (i=0; i<4; i++) {
    		for (j=0; j<4; j++) {
    			if (i==j || i+j==3) {
    				a[i][j] = 1;
    			}else{
    				a[i][j] = 0;
    			}
    		}
    	}
    	return a;
    }
    
    
    void main()
    {
    	int a[4][4],b[4][4];
    	int i, j;
    	printf("请向4*4数组逐个输入数据:\n");
    	for (i=0; i<4; i++) {
    		for (j=0; j<4; j++) {
    			scanf("%d", &a[i][j]);
    			if (j == 3) {
    				printf("\n");
    			}
    		}
    	}
    	printf("使二维数组中两条对角线上的元素均为1,其余元素均为	0后的数组:\n");
    	diagonal_assignment(a);
    	
    	for (i=0; i<4; i++) {
    		for (j=0; j<4; j++) {
    			printf("%d ", a[i][j]);
    			if (j == 3) {
    				printf("\n");
    			}
    		}
    	}
    	system("pause");
    }
    
    
    

    注意:main函数中的传入实参a与函数diagonal_assignment的形参共用一个内存单元,而数组在函数中传递的形式是它本身的首地址,因此函数diagonal_assignment只需直接返回修改后的a的地址,然后在main函数中调用该函数,就可以实现数组a的修改。

    推荐文章:
    版权声明:本文为CSDN博主「这个青年姓于」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Laoynice/article/details/79196993

    展开全文
  • } 扩展资料: 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的...
  •  ... 格式:声明输出变量类型 函数命名(参数){函数代码}  example:int sum(int a,int b){  int c=a+b;  return c;  }  使用时直接打函数名 如:int num=sum(1
  • c语言中用函数传递数组的两个方法

    千次阅读 2015-04-03 16:45:15
    #define GetLen(arr) sizeof(arr)/sizeof(int) //使用这种方式得到数组的长度  //这种方式也可以改变main方法中的数组元素的值  //缺点:每次都要传递5*4 20个字节的数组长度的数组形参  void f1(int a...
  • 转置二维数组的实例代码,探究二维数组作为参数...void main(){//在主函数内声明被调函数void convert(int array[][3]);int i,j;printf("输入数组:\n");for(j=0;jfor(i=0;iscanf("%d",&array[i][j]);printf("\n"...
  • 数组参数属于指针参数,指针参数即时传址参数(或叫引用参数), 如果想在函数中修改参数的值, 这是唯一的途径.如果把数组当作参数, 不管愿意与否, 它就是指针, 指向第一个值的指针.1. 数组参数就是指向第一个元素的...
  • ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!...所以,你可以说C语言程序是由函数构成的。 二、函数的定义 1.定义函数的目的 将一个常用的功能封装起来,方便以后调用 2.定义函数
  • ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!...所以,你可以说C语言程序是由函数构成的。 二、函数的定义 1.定义函数的目的 将一个常用的功能封装起来,方便以后调用 2.定义函数的步骤
  • C语言函数中的数组传递

    千次阅读 2019-07-02 17:17:14
    #include <stdio.h> typedef unsigned char uchar; //---------------------------------------------------全局...//---------------------------------------------------子函数声明 void func3(void)...
  • c语言将二维数组当做一维数组传入函数,并能输出原二维数组的各元素,怎样理解?
  • 二维数组实质上也就是一维数组,a[2][3]可看做一个2个元素的一维数组,这2个元素又是另一个数组,在内存中,它的排布如下: #include "stdio.h"int main(int argc, char *argv[]){char a[2][3]={{1,3,9},{2,4,8}};...
  • 主要给大家介绍了关于C语言中二维数组作为函数参数来传递的三种方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C语言有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • C语言自定义函数如何返回数组

    万次阅读 多人点赞 2017-11-03 21:27:27
    C语言自定义函数如何返回数组  C语言研究中心  CTO 9个月前 (01-28) 4759次浏览 5个评论 最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢? 能否直接在自定义 函数中,写成char *类型...
  • C语言函数指针数组

    2014-11-20 11:18:30
    最近在学习Java面向对象编程,同时发现C语言
  • 0,示例代码在文章末尾1,定义函数数组//coding 1 /*warning:在说明和定义函数时,要在数组参数的尾部加上一对方括号, 括号里的数字表示数组的长度。*/ int arr[10] = {10,9,8,7,6,5,4,3,2,1}; 2,往函数参数中传...
  • #include <stdio.h>...void dia(int a[], int n)/*数组传的其实是地址*/ { int i; for(i=0;i<n;i++) { if(a[i]%2==0) a[i]*=2; else a[i]*=3; } } main() { int ...
  • C语言函数数组地址参数

    千次阅读 2018-12-20 17:08:56
    main()函数里写成ReadReg(Addr + i, buf[i]); 出错。 buf[i]前需加取地址符&amp; #include "stdio.h" int i; int Addr;, int buf[16] = {0}; int ReadReg(int a, int * b) { ... ... } void...
  • C语言中将二维数组作为函数参数来传递

    万次阅读 多人点赞 2018-03-07 20:17:25
    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下:方法一, 形参给出第二维的长度。例如:#include &lt;stdio.h&gt;void func(int n, char str[ ][5] ){ int i; for(i = 0; i &lt; ...
  • c语言函数传递数组

    2014-10-31 12:51:00
    1、传递数组,打印不出来 #include <stdio.h> void solve() { printf("%d",x[0]); } int main() { int i; for(i=0;i<n;i++) { scanf("%d",&x[i]); ...
  • 想来学C语言的人,都会觉得数组并不是很难,一问C语言最难的是什么?指针?结构体? 今天我就以我们认为不难的数组聊聊。 上学的时候老师就告诉我们:一个[]就想当与一个*。这句话有问题嘛?答案是没问题。 但是,...
  • C语言—指针与数组

    2014-07-24 22:43:46
    C语言—指针与数组
  • c语言中,指针的用途十分广泛,而其与数组函数的关系也十分密切。下面我们来简单介绍一些指针的应用。 1.指针数组  指针数组:首先它是一个数组,这个数组中的内容都是指针变量。如:int * parr [3] 是指一个...
  • 一、函数指针的声明与初始化 ... int max_fun(int a, int b); /*函数指针的声明,声明了两个形参都为int类型,返回值为int类型的函数指针*/ int (*fp)(int, int); /*指针初始化*/ fp = max_fun; //fp = &amp...
  • 数组的作为函数参数2.结构体 0 . 说明 ​ 看滴水逆向视频总结笔记 ​ 编译器VC++6.0 1.数组 1.数组对应堆栈空的分配 ​ 数组在汇编中的位置与普通局部变量有一些细节上的差异,一般局部变量都是从栈底依次分配到栈底...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,198
精华内容 14,879
关键字:

c语言向函数传入数组

c语言 订阅