1. 程式人生 > >C++之返回陣列指標

C++之返回陣列指標

因為陣列不能被拷貝,所以函式不能返回陣列。不過函式可以返回陣列的指標或者引用,今天我們一起來學習下C++下的幾種返回陣列指標的方法

一、類型別名

這是返回陣列指標最直接的一種方法了

#include<iostream>

using namespace std;

typedef int arrT[10];//類型別名,表示含有10個整形的陣列
//using arrT = int[10]; //arrT的等價宣告,c++11版本新加的

int arry[10] = {1,2,3,4,5,6,7,8,9,10};
arrT* func()
{
	return &arry;
}

int main()
{
    int (*p)[10] =func();
	for(int i=0;i<10;i++)
	{
		cout<<(**p)++<<" "<<endl;
	}
	return 0;
}
列印結果:

二、後接陣列維度

     Type (*function(parameter_list))[dimension]

類似於其他陣列的宣告,Type表示元素的型別,dimension表示陣列的大小。

(*function(parameter_list))兩端的括號必須存在,就像我們定義p2時兩端必須有括號一樣,如果沒有這對括號,函式的返回型別將是指標的陣列。

int arr[10];                       //arr是一個含有10個整數的陣列

int *p1[10];                     //p1是一個含有10個指標的陣列

int (*p2)[10] = &arr;     //p2是一個指標,指向含有10個整數的陣列。

原始碼:

#include<iostream>

using namespace std;

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

int (*func())[10]
{
	return &arry;
}

int main()
{
    int (*p)[10] =func();
	for(int i=0;i<10;i++)
	{
		cout<<(**p)++<<" ";
	}
	    cout<<endl;
	return 0;
}
列印結果:


三、使用尾置返回型別

在C++11中新增了一種方法,任何函式的定義都能使用尾置返回,但是這種形式對於返回型別教複雜的型別最有效,比如返回型別是陣列的指標或者是陣列的引用時。尾置返回型別跟在形參列表後面並以一個->符號開頭。為了表示函式真正的返回型別跟在形參列表之後,在本應該出現返回型別的地方仿置一個auto。

原始碼:

#include<iostream>

using namespace std;

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

auto func() -> int(*)[10]
{
	return &arry;
}

int main()
{
    int (*p)[10] =func();
	for(int i=0;i<10;i++)
	{
		cout<<(**p)++<<" ";
	}
	    cout<<endl;
	return 0;
}
列印結果:

四、使用decltype

如果我們知道函式返回的指標將指向哪個陣列,就可以使用decltype關鍵字宣告返回型別。

原始碼:

#include<iostream>

using namespace std;

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

decltype(arry) *func()
{
	return &arry;
}

int main()
{
    int (*p)[10] =func();
	for(int i=0;i<10;i++)
	{
		cout<<(**p)++<<" ";
	}
	    cout<<endl;
	return 0;
}
列印結果:

decltype並不負責把陣列型別轉換成對應的指標,所以decltype的結果是一個數組,要想func返回指標還必須在函式宣告時加一個*符號。