1. 程式人生 > >以指標作為引用引數(二)

以指標作為引用引數(二)

題目(一):編寫一個函式,把一個整數陣列中的前n個元素複製到另一個數組的前端。其中一個數組應該為常量引數,另一個數組應為為普通的陣列引數。

#include<iostream>
using namespace std;

//傳入其中一個數組為常量引數,另一個數組為普通陣列
//因為需要改變陣列A的內容,所以引數為普通陣列,不需要改變陣列B的的內容,所以為常量引數(const)
void copy_to_front(int target[], const int source[],size_t m);
int main()
{
	int A[3] = {0};
	int B[] = { 444,555,666 };
	copy_to_front(A,B, sizeof(B) / sizeof(B[0]));
	for (int i = 0; i < sizeof(A)/sizeof(A[0]); i++)
	{
		cout << A[i] << " ";
	}
	cout << endl;
	system("pause");

	return 0;
}
void copy_to_front(int target[],const int source[],size_t n)
{
	for (int i = 0; i < n; i++)
	{
			target[i] = source[i];
	}
}

可以看到,因為target[]在函式中元素的內容會被賦值,所以不能傳遞常量引數。對於陣列source[]陣列,只希望讀取其元素內容,並不希望它改變,所以最好傳遞常量引數。

題目(二):在函式中建立動態陣列,將陣列A和陣列B首位相接組成一個新陣列

#include<iostream>
using namespace std;

int*& copy_to_front(const int A[],int n,const int B[],int m);
int main()
{
	int A[] = { 1,2,3};
	int B[] = { 444,555,666 };
	int *p = copy_to_front(A,sizeof(A)/sizeof(A[0]),B,sizeof(B)/sizeof(B[0]));
	for (size_t i = 0; i < sizeof(A) / sizeof(A[0]) + sizeof(B) / sizeof(B[0]);i++)
	{
		cout << p[i] << " ";
	}
	cout << endl;
	system("pause");

	return 0;
}
int*& copy_to_front(const int A[],int n,const int B[],int m)
{
	int final = m + n;
	//在這裡動態建立一個數組p,你看p陣列中元素個數(final)是由程式呼叫copy_to_front才確定下來的
	//我們應該清楚滴知道,返回值最後應該是這個指標p的引用,所以使用int*&表示返回指標的引用!
	//為了簡潔,我們當然可以使用typedef int* p_ptr;
	int *p = new int[final];
	for (size_t i = 0; i < final; i++)
	{
		if (i<n)
			p[i] = A[i];
		else
			p[i] = B[i - n];
	}
	//注意最後返回的是指標的引用哦哦哦,所以使用的就是int*& 返回值啦
	return p;
}

可以發現,陣列作為函式引數傳遞的都是常量引數,在函式中動態建立陣列,最後返回指向這個動態陣列的指標,所以返回的是指標引用!和前一篇的開篇提到:在程式中使指標指向一個新的位置,這是指標作為函式引數傳遞的唯一情況!(type_name*&) 

輸出: