1. 程式人生 > >在C/C++中如何使函式返回陣列

在C/C++中如何使函式返回陣列

 Java語言的函式可以輕易的返回一個數組,而C/C++卻不能直接返回一個數組。這是由於在C/C++中,陣列不是一種型別,因此不能被直接返回。
    在C/C++中,一般有兩種方法來返回一個數組。

第一種方法:
 返回一個指向陣列的指標,例如char (*retArray)[10]聲明瞭一個函式retArray,該函式可以返回指向具有10個char元素的陣列
 例子如下:

#include <STDIO.H></STDIO.H>
#include <STDLIB.H></STDLIB.H>

int (*retArray())[10]
{
 int (*a)[10];
 int i=0;
 /*動態開闢空間*/
 a=calloc(10,sizeof(int));
 /*賦值*/
 for(i=0;i<10;i++)
 {
  (*a)[i]=i;
 }
 return a;

}
int main()
{
 int (*b)[10];
 /*函式返回指向陣列的指標*/
 b=retArray();
 /*列印第一個元素*/
 printf("%d/n",(*b)[0]);
 /*釋放空間*/
 free(b);
 return 0;
}

第二種方法
 如果你不喜歡用指標的形式返回陣列,那麼可以採用返回一個結構的形式。這種形式相對較安全,可以避免忘記釋放指標而造成記憶體洩露,
也可以避免訪問懸掛指標造成的錯誤。但缺點是由於結構是先拷貝再返回,因此如果結構較大時,會影響效率和佔用較大記憶體。


 例子如下:

#include <STDIO.H></STDIO.H>
#include <STDLIB.H></STDLIB.H>

typedef struct
{
 int a[10];
}RETA;
RETA retArray()
{
 RETA x;
 int i=0;
 for(i=0;i<10;i++)
  x.a[i]=i;
 return x;
}
int main()
{
 int b[10];
 b=retArray().a;
 printf("%d/n",b[5]);
 /**或者這樣呼叫
 RETA y=retArray();
 printf("%d/n",y.a[3]);
 **/
 return 0;
}

注意:

(1)在返回指標時要切記要避免記憶體洩露和訪問懸掛指標

 (2)很多人認為指標和陣列等價的,這是錯誤的。int (*a)[10]和int b[10]兩者是不能直接用a=b來賦值的。在陣列和指標作為函式引數傳遞時,二者可以認為等價,這是因為陣列會被轉化為指標來傳遞。

 (3)返回多維陣列方法類似。

相關推薦

C如何使函式返回陣列

    Java語言的函式可以輕易的返回一個數組,而C/C++卻不能直接返回一個數組。這是由於在C/C++中,陣列不是一種型別,因此不能被直接返回。    在C/C++中,一般有兩種方法來返回一個數組。 第一種方法: 返回一個指向陣列的指標,例如char (*retArray

C/C++如何使函式返回陣列

 Java語言的函式可以輕易的返回一個數組,而C/C++卻不能直接返回一個數組。這是由於在C/C++中,陣列不是一種型別,因此不能被直接返回。    在C/C++中,一般有兩種方法來返回一個數組。 第一種方法: 返回一個指向陣列的指標,例如char (*retArray)[

C++函式返回陣列指標的幾種方法總結

因為陣列不能被拷貝,所以函式不能返回陣列。不過,函式可以返回陣列的指標或引用。返回陣列指標的方法有以下幾種:     1、方法一:使用類型別名。如下         typedef int arrt[10];//arrT是一個類型別名,它表示的型別是含有10個整數的陣列   

C函式返回陣列

C 語言不允許返回一個完整的陣列作為函式的引數。但是,可以通過指定不帶索引的陣列名來返回一個指向陣列的指標。如果您想要從函式返回一個一維陣列,必須宣告一個返回指標的函式,如下: int * myFunction() { } 另外,C 不支援在函式外返回區域性變數的地址,除非定義區域性

C語言第4課——從函式返回陣列

C 語言不允許返回一個完整的陣列作為函式的引數。但是,可以通過指定不帶索引的陣列名來返回一個指向陣列的指標。 如果想要從函式返回一個一維陣列,必須宣告一個返回指標的函式,如下: int * myFunction() { . . . } 另外,C 不支援在函式外返回區域性變數的地址,除

C++ 從函式返回陣列

C++ 不允許返回一個完整的陣列作為函式的引數。但是,您可以通過指定不帶索引的陣列名來返回一個指向陣列的指標。 如果想要從函式返回一個一維陣列,就必須宣告一個返回指標的函式,如下: int * myFunction() { . . . } 另外,C++ 不支援在函式外返回區域性變數的地址

C++函式返回字串

轉:http://379910987.blog.163.com/blog/static/3352379720111026101835400/ char* Alphabet(int n){    char* pStr=new char[n+1];//last one

C語言打印返回

返回值 struct demo bsp %d return username har strdup demo: ----return :返回值------------------ int mosquitto_username

C#VS一個函式呼叫另一個函式的程式碼樣例

//主函式 說明:下面的函式是想求許可證的十六位編號,最後一位是許可編號的校驗碼,是以本體碼("JY" + xukbh)為基礎來計算 entities[0].XuKeZhengBianHao = "JY" + xukbh + xukebianhaojiaoyanma(xukbh);  

C++類建構函式

我們在定義一個類之後,在利用該類定義了一個物件後,往往需要對該物件中資料成員變數進行初始化。有時候我們會誤操作,忘記初始化或者重複初始化,這樣做都會造成程式的崩潰。C++給我們提供了一個很有用的方法,就是類的建構函式。 C++類的建構函式,和其它成員函式一樣,在類中定義。不過建構函式和其他成

Telerik UI for ASP.NET AJAX教程:C函式程式設計

【下載Telerik UI for ASP.NET AJAX最新版本】 在面向物件程式設計(OOP)中,我們習慣於使用物件集合或簡單資料型別。我們經常使用LINQ對這些集合進行排序和過濾,作為業務邏輯行為或資料轉換的一部分。雖然這些是我們經常執行的有用任務,但很容易忘記C#中的函式可以被視為資料

C++STL函式物件

前言   所謂函式物件,即 Function Object ,或者稱之為仿函式(functors)。顧名思義,就是像函式的一種物件,我們可以把函式物件看作是一個函式與物件的結合,一方面,它本質上是一個物件,但主要功能是使用其成員函式(主要是operator())在不同的容器和函式中傳

c語言輸出函式putc_putchar_puts-printf

//輸入輸出:英文是Input/Output 簡稱IO。 //putchar:將指定的數值對應的ASCII字元列印到螢幕上。 //putc:不但指定數值,而且還可以指定列印到哪裡去。 //stdout:是指定列印到螢幕上 standard out . //putc可以指定列印到一個檔案(FILE *

C ++ 指標 | 指標與函式陣列_3

指標與函式 1、void 函式名(int *p) #include<iostream> using namespace std; void Increment(int *p) { *p = (*p) + 1; } int main() { int a;

C語言交換兩個陣列的值

  昨天我們做了交換兩個變數的值,今天我們來看看如何交換兩個陣列的值(陣列內數的個數相同)。   我們可以這樣考慮,陣列不過是數的集合,既然我們會交換兩個數的值,那麼陣列只不過是多次交換兩個數的值,而且陣列內素下標又是依次增大的,所以這裡可以使用一個for迴圈。

C語言:理解函式指標陣列和定義

函式指標陣列和定義 陣列是一個存放相同型別資料的儲存空間,那我們已經學習了指標陣列,比如:     int *arr[10];//陣列的每個元素是int* 那要把函式的地址存到一個數組中,那這個陣列就叫函式指標陣列,那函式指標的陣列如何定義呢?   int (

c++ STLsort函式的三種使用方法

複習一下~ STL,C++中的標準模板庫, 使用起來方便並且效率較高; sort函式有三種用法: 一:對基本型別陣列從小到大排序 sort( 陣列名+n1,陣列名+n2); 將陣列中下標從n1到n2的元素進行從小到大排序,不包括n2,通過n1,n2 可以對整

C++11insert的返回

在C++11中,關聯容器都有insert()操作,其返回值是一個pair,pair的first返回指向元素的迭代器,second是一個bool,true表示原容器中沒有要插入的元素並且插入成功,false與前者相反。 map<int,int> m;

C語言指標與指標陣列的理解!

指標就是地址! 概念 C語言中,允許用一個變數來存放地址,這種變數稱為指標變數。一個指標變數的值就是某個記憶體單元的地址。指標變數就是用來存放指標(地址)的變數! &運算子:求某一變數在儲存單元中的記憶體地址。 *運算子:取出指標變數所指向變數的內容,後面

c語言常用函式

memset void *memset(void *s, int ch, size_t n); 函式解釋:將s中當前位置後面的n個位元組 (typedef unsigned int size_t )