精华内容
下载资源
问答
  • 函数返回数组

    2018-09-13 11:36:45
    关于C语言函数返回一个数组c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意:1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。可以是全局变量,...

    本文转自:https://blog.csdn.net/earbao/article/details/53401800

    关于C语言函数返回一个数组
    c语言中函数不能直接返回一个数组,但是可以用其他方式实现类似功能,不过需要注意:
    1、该数组不能是返回函数的局部变量数组,因为局部变量数组在退出函数后会被释放。
    可以是全局变量,静态局部变量,动态分配内存,以及从函数参数传过来的数组地址。
    2、返回指针时,无法返回长度,所以需要其它方式传回数组长度,以下是几种常用的方法。
    1) 约定固定长度;
    2) 以函数参数返回数组长度;
    3)将长度保存在全局变量中;
    4)约定数组结束标记;
    5)在数组中存储数组长度,如存在第一个元素中。

    有些时候需要子函数将一个数组返回出来,通常是两种方法,一种是靠指针,另一种是结构体。

    一、先来看依靠指针怎么做

    1. #include <stdio.h>
    2. char *test(char *tmp)
    3. {
    4. return tmp;
    5. }
    6. void main(void)
    7. {
    8. printf("%s",test("第一个测试例子\n"));
    9. }

    二、使用结构体作为返回值来传递数组

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <string.h>
    4. #ifdef _WIN32
    5. //#include <Windows.h>
    6. #include <vld.h>
    7. #endif
    8. //直接返回指针,但是无法返回长度
    9. char *test(char *tmp)
    10. {
    11. return tmp;
    12. }
    13. //返回数组首地址
    14. char *test2()
    15. {
    16. //char tmp[30]="第一个测试例子\n";//错误写法,写成这样编译时弹出警告,最后的结果也是乱码
    17. char *tmp="test2 demo";//写成这样可以用指针返回数组首地址
    18. return tmp;
    19. }
    20. //使用静态全局变量
    21. char *test3()
    22. {
    23. //静态全局变量,但不是线程安全的,在多线程环境中就危险了
    24. static char tmp[30]="third demo test003";
    25. return tmp;
    26. }
    27. //动态分配内存, 调用malloc在堆上分配内存,记得free
    28. int* getArrays(int n)
    29. {
    30. //malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址
    31. int* array = (int *)malloc(sizeof(int)*n);
    32. int base=100;
    33. for(int i=0;i<n;i++)
    34. {
    35. array[i]=base+i;//赋值
    36. }
    37. return array;
    38. }
    39. void showArr(int* arr,int len)
    40. {
    41. for(int i=0;i<len;i++)
    42. {
    43. printf("%d ",arr[i]);
    44. }
    45. printf("\n");
    46. }
    47. //从函数参数传过来的数组地址
    48. int getCharsArray(char* output,int len)
    49. {
    50. strncpy(output,"123456789 from china!",len);
    51. return 0;
    52. }
    53. //动态分配内存
    54. char* getCharsArrayByPoint(int len)
    55. {
    56. //malloc数组建立在heap堆上,调用完函数还在,返回了那个堆上数组的首地址
    57. char* array = (char *)malloc(sizeof(char)*len+1);
    58. memset(array,0,sizeof(char)*len+1);
    59. strncpy(array,"getCharsArrayByPoint from china!",len);
    60. return array;
    61. }
    62. struct ArrayStruct
    63. {
    64. char buf[1024];
    65. };//定义结构体时不要忘了分号
    66. //使用结构体作为返回值来传递数组
    67. struct ArrayStruct byStruct(char *tmp)
    68. {
    69. struct ArrayStruct arr;
    70. strcpy(arr.buf,tmp);
    71. return arr;
    72. }
    73. //关于C语言函数返回数组的问题
    74. int main(int argc, char *argv[])
    75. {
    76. char* line=test("first test demo\n");
    77. printf("%s",line);
    78. char* line2=test2();
    79. printf("%s\n",line2);
    80. char* line3=test3();
    81. printf("%s\n",line3);
    82. char line4[1024]={0};
    83. getCharsArray(line4,sizeof(line4));
    84. printf("%s\n",line4);
    85. char *line5=getCharsArrayByPoint(150);
    86. printf("%s\n",line5);
    87. free(line5);
    88. struct ArrayStruct arrStruct;
    89. arrStruct=byStruct("byStruct");//用结构体作为返回值传递数组
    90. printf("%s\n",arrStruct.buf);
    91. #define arrLen 10
    92. int* arr=getArrays(arrLen);
    93. showArr(arr,arrLen);
    94. free(arr);//和malloc配对
    95. return 0;
    96. }

    两点注意:

    1、数组之间的赋值不要直接,即不要直接将数组A赋给数组B,而是要用strcpy(字符型数组)或者memcpy(非字符型数组)。

    2、用结构体定义变量和函数时不要忘了结构体名。







    展开全文
  • c 语言 函数返回数组 介绍 (Introduction) In this tutorial, we are going to understand how we can return an array from a function in C++. 在本教程中,我们将了解如何从C ++中的函数返回数组 。 在C ++函数...

    c 语言 函数返回数组

    介绍 (Introduction)

    In this tutorial, we are going to understand how we can return an array from a function in C++.

    在本教程中,我们将了解如何从C ++中的函数返回数组

    在C ++函数中返回数组的方法 (Methods to Return an Array in a C++ Function)

    Typically, returning a whole array to a function call is not possible. We could only do it using pointers.

    通常,无法将整个数组返回给函数调用。 我们只能使用指针来做。

    Moreover, declaring a function with a return type of a pointer and returning the address of a C type array in C++ doesn’t work for all cases. The compiler raises a warning for returning a local variable and even shows some abnormal behavior in the output.

    此外,在C ++中用指针的返回类型声明函数并返回C类型数组的地址并不适用于所有情况。 编译器会针对返回局部变量发出警告,甚至在输出中显示一些异常行为。

    Hence, returning an array from a function in C++ is not that easy. But we can accomplish that by following any of the below mentioned methods.

    因此,从C ++中的函数返回数组并不是那么容易。 但是我们可以通过遵循以下任何一种方法来实现。

    Let’s get right into it.

    让我们开始吧。

    1.使用指针 (1. Using Pointers)

    As we mentioned earlier, returning a normal array from a function using pointers sometimes gives us unexpected results. But this behaviour and warnings can be avoided by declaring the array to be a static one.

    如前所述,使用指针从函数返回普通数组有时会给我们带来意想不到的结果。 但是可以通过将数组声明为static数组来避免这种行为和警告。

    Let us see how.

    让我们看看如何。

    
    #include<iostream>
    using namespace std;
    
    int* demo() //return type- address of integer array
    {
    	static int a[5]; //array declared as static
    	for(int i = 0; i<5; i++)
    	{
    		a[i] = i; //array initialisation
    	}
    
    	return a; //address of a returned
    }
    
    int main()
    {
    	int* ptr; //pointer to hold address
    	int i;
    	ptr = demo(); //address of a
    	cout<<"Array is: ";
    	for(i=0 ; i<5; i++)
    		cout<<ptr[i]<<"\t"; //ptr[i] is equivalent to *(ptr+i)
    		
    	return 0;
    }
    

    Output:

    输出:

    
    Array is: 0     1       2       3       4
    

    Here, we have declared the function demo() with a return type int *(pointer) and in its definition, we have returned a (serves as both array name and base address) to site of the function call in main().

    在这里,我们用返回类型int * (指针)声明了函数demo() ,并在其定义中向main()中的函数调用位置返回a (同时用作数组名和基地址main()

    As we can see from the above output, the array is successfully returned by the function.

    从上面的输出中可以看到,该函数成功返回了数组。

    2.在C ++中使用结构 (2. Using a Structure in C++)

    We can also make a function return an array by declaring it inside a structure in C++. Let us see how.

    我们还可以通过在C ++中结构内部声明函数来使函数返回数组。 让我们看看如何。

    
    #include <iostream>
    using namespace std;
    
    struct demo
    {
    	//array declared inside structure
    	int arr[100];
    };
    
    struct demo func(int n) //return type is struct demo
    {
    	struct demo demo_mem; //demo structure member declared
    	for(int i=0;i<n;i++)
    	{
    		//array initialisation
    		demo_mem.arr[i] = i;
    	}
    	return demo_mem; //address of structure member returned
    }
    
    int main() 
    {
    	struct demo a;
    	int n=5; //number of elements
    	
    	a=func(n); //address of arr
    	
    	cout<<"The Array is : ";
    	for(int i=0;i<n;i++)
    	{
    		cout<<a.arr[i]<<"\t";
    	}
    	
    	return 0;
    }
    

    Output:

    输出:

    
    Array is: 0     1       2       3       4
    

    Here, note that we have declared the array arr inside the structure demo. And this time the function has a return type of the structure itself and return demo_mem (structure variable) instead of the array.

    在这里,请注意,我们已经在结构 demo声明了数组arr 。 这次函数具有结构本身的返回类型,并返回demo_mem (结构变量)而不是数组。

    In this way using another structure variable a, we can access the array arr in the main() function.

    这样,使用另一个结构变量a ,我们可以在main()函数中访问数组arr

    3.使用std :: array (3. Using std::array)

    For std::array in C++, returning the array name from a function actually translates into the the whole array being returned to the site of the function call.

    对于C ++中的 std::array ,从函数返回数组名称实际上转化为要返回到函数调用站点的整个数组。

    
    #include <iostream>
    #include<array>
    using namespace std;
    
    std::array<int,5> func() //function with return type std::array
    {
        std::array<int,5> f_array; //array declared
        
    	for(int i=0;i<5;i++)
    	{
    		//array initialisation
    		f_array[i] = i;
    	}
    
        return f_array; //array returned
    }
    
    int main() 
    {
    	std::array<int,5> arr; //array with length 5
    	
    	arr=func(); //function call
    	
    	cout<<"The Array is : ";
    	for(int i=0;i<5;i++)
    	{
    		cout<<arr[i]<<"\t";
    	}
    	
    	return 0;
    }
    

    Output:

    输出:

    
    Array is: 0     1       2       3       4
    

    Hence it is clear from the output, that the array return by the function func() was successful.

    因此,从输出中可以明显看出,函数func()返回的数组是成功的。

    结论 (Conclusion)

    So in this tutorial, we learned about the different methods by which we can return an array from a C++ function.

    因此,在本教程中,我们了解了可以从C ++函数返回数组的不同方法。

    For any further questions, feel free to use the comments below.

    如有其他疑问,请随时使用以下评论。

    参考资料 (References)

    翻译自: https://www.journaldev.com/39081/return-array-in-c-plus-plus-function

    c 语言 函数返回数组

    展开全文
  • C语言自定义函数返回数组的方法(图文详解)最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢?能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下:直接返回str数组名(注意不需要加...

    C语言实现删除数组中某个元素_后端开发

    大家知道C语言实现删除数组中某个元素方法吗?下面将讲述在C语言中实现删除数组中某个元素的两种方法,大家一起看看吧。

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

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

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

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

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

    如下:

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

    怎么样,可以理解吧!

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

    如下图:

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

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

    Python初学者应该了解的知识_后端开发

    欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多Python的基础知识,正在努力成长的过程中。开办这个专栏,正是为了帮助像我当年一样困惑的Python初学者走出困境、快速成长。希望我的经验能真正帮到你们。

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

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

    这样讲,大家能理解吗?

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

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

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

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

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

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

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

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

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

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

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

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

    推荐教程:《C语言》

    展开全文
  • c++ 函数返回数组

    千次阅读 2018-04-03 13:17:05
    C 从函数返回数组C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。我们将在下一章中讲解有关指针的知识,您可以先跳过本章,等了解了 C 指针的概念...

    从函数返回数组


    C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。我们将在下一章中讲解有关指针的知识,您可以先跳过本章,等了解了 C 指针的概念之后,再来学习本章的内容。

    如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下:

    int * myFunction(){...}

    另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。

    现在,让我们来看下面的函数,它会生成 10 个随机数,并使用数组来返回它们,具体如下:

    实例

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h> /* 要生成和返回随机数的函数 */
    int * getRandom( )
    {
        static int r[10];
        int i; /* 设置种子 */
        srand( (unsigned)time( NULL ) );
        for ( i = 0; i < 10; ++i)
        {   
            r[i] = rand();
            printf( "r[%d] = %d\n", i, r[i]);
        }
        return r;
    }

    /* 要调用上面定义函数的主函数 */
    int main ()
    {
        /* 一个指向整数的指针 */
        int *p;
        int i;
        p = getRandom();
        for ( i = 0; i < 10; i++ )
        {
            printf( "*(p + %d) : %d\n", i, *(p + i));
        }
        return 0;
    }

    当上面的代码被编译和执行时,它会产生下列结果:

    r[0] = 313959809
    r[1] = 1759055877
    r[2] = 1113101911
    r[3] = 2133832223
    r[4] = 2073354073
    r[5] = 167288147
    r[6] = 1827471542
    r[7] = 834791014
    r[8] = 1901409888
    r[9] = 1990469526
    *(p + 0) : 313959809
    *(p + 1) : 1759055877
    *(p + 2) : 1113101911
    *(p + 3) : 2133832223
    *(p + 4) : 2073354073
    *(p + 5) : 167288147
    *(p + 6) : 1827471542
    *(p + 7) : 834791014
    *(p + 8) : 1901409888
    *(p + 9) : 1990469526
    展开全文
  • 函数返回数组指针

    2016-01-19 20:27:28
    数组不能被拷贝,所以函数不能返回数组,使用函数返回数组的指针或引用的方法。 使用类型别名,声明一个返回数组指针的函数typedef int arrT[10];arrT是一个类型别名,它表示的类型含有10个整数的数组。 等价于...
  • 关于函数返回数组以及数组的定义的一些记录
  • vb.net函数返回数组

    千次阅读 2018-10-18 17:11:13
    今天写了一个程序需要函数返回数组,看了别的网友的程序发现有bug,特此记录一下   返回函数写法 Private Function Fun_Fp32ToByte(ByVal fp32 As Single) As Byte() Dim byt(3) As Byte byt = System....
  • 最近在通过函数返回数组时踩到了一些坑,在此记录一下。 首先C++函数的返回类型没有“数组”这一结构,因此一般情况下我们会采用指针去接受数组的首地址来进行返回。另外由于函数体内定义的变量均为局部变量,局部...
  • C++使函数返回数组

    2015-10-04 21:22:16
    ps:由于博主一直以来用的都是php,所以使用函数返回数组感觉很方便,最近刷题的时候,总是想着返回数组。另外吐槽,oj上的刷题系统的格式问题真是奇葩!一会要输出空格,一会不要空格,博主几乎崩溃。解几个水题爆炸...
  • C++中如何使函数返回数组

    万次阅读 2016-05-18 16:17:51
    C++中如何使函数返回数组?以前使用java返回数组这些类型都比较方便,用c++的时候突然发现c++不支持返回数组,我就找了下应该怎么实现这这种返回 在C++中,数组不是一种类型,因此不能被直接返回。一般有两种方法来...
  • C/C++中想要一个函数返回数组,此类问题,应用场景往往为了解决函数间相互通信,比如某个函数内处理的完的结果数据需要交接给另一个函数的情况,方法大概有三种:(例如在函数func中对a[]数组进行赋值,之后可以再对...
  • C 从函数返回数组 C 数组 C 语言不允许返回一个完整的数组作为函数的参数。但是,您可以通过指定不带索引的数组名来返回一个指向数组的指针。我们将在下一章中讲解有关指针的知识,您可以先跳过本章,等了解了 C ...
  • C从函数返回数组

    万次阅读 多人点赞 2018-11-08 11:05:04
    如果您想要从函数返回一个一维数组,必须声明一个返回指针的函数,如下: int * myFunction() { } 另外,C 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。 现在,让我们来看下面的函数...
  • C++ 从函数返回数组

    2021-02-21 15:39:44
    如果您想要从函数返回一个一维数组,您必须声明一个返回指针的函数,如下: int * myFunction() { static int r[10]; ... return r; } 另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static...
  • 函数返回数组指针的几种声明方式:1.直接声明:Type (*function(parameter_list))[dimension] eg:int (*func(int ))[10]; //func接受一个int实参,返回一个数组指针,指向含有10个int的数组。 类型别名:typedef ...
  • C++ 函数返回数组

    千次阅读 2019-05-30 11:00:05
    //在堆区开辟空间存放数组(若是在栈区存放数组,随着函数结束,数组名指向的地址存放的内容也会被系统释放,而堆上的空间是由程序员自动给予分配和释放的) int *p = malloc(COUNT * sizeof(int)); //static int p...
  • 函数不能返回数组,但是可以返回数组指针或引用,也可以通过返回指针来实现。 使用类型别名的好处是:你可以用这个类型别名定义变量,变量的元素个数与你返回的数组元素个数相等,访问时可以避免越界问题。
  • C语言,函数返回数组

    千次阅读 2018-02-04 21:48:41
    可以的,但大多数方式都是说将数组的首地址作参数输入,或是指针函数返回一个数组的首地址。而这种方式并非真正意义上的“输入”或“输出”。 参数是一个新的量被附了参考量的值,无论函数内部如何改变这个参数,都...
  • 6.4数组变量与函数 6.4.1向函数传递数组  向脚本函数传递数组变量。如果试图将数组变量作为单个参数传递,是无法正常工作的。操作实例如下: #!/bin/bash #数组当作单个参数传递是无法工作的 function testit ...
  • 因为数组不能被拷贝, 所以函数不能返回数组. 不过, 函数可以返回数组的指针或引用. 声明一个返回数组指针的函数 Type (*function(parameter_list))[dimension] int (*func(int i))[10]; func(int i) 表示调用 func...
  • function arraydblr { local origarray local newarray local elements local i origarray=($( echo " $@ ...向函数传递的参数是$arg1,我们知道...函数返回同理,返回的是单个的数值,接受的时候加上(),组成数组
  • 在C中如何使函数返回数组  2009-10-30 21:57:21| 分类: 程序空间|字号 订阅 Java语言的函数可以轻易的返回一个数组,而C/C++却不能直接返回一个数组。这是由于在C/C++中,数组不是一种类型...
  • 怎样让函数返回数组

    万次阅读 2016-10-15 10:23:59
    用动态内存new和形参的方法让C++中函数返回一个数组
  • 从ocx函数中的函数返回数组型的变量,这些变量是存入了exe的内存是么?那么vb编程系统内多出来的存储会不会影响效率?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 37,522
精华内容 15,008
关键字:

函数返回数组