久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

7.3 函數(shù)和數(shù)組

 Cui_home 2023-04-10 發(fā)布于天津
  • 對數(shù)組進行計算時,,需要傳遞兩個參數(shù):① 數(shù)組名;② 數(shù)組長度。

  • int arr[]:方括號為空表明可以將任何長度的數(shù)組傳遞給該函數(shù)。

  • 可以使用數(shù)組名那樣使用指針。程序?qū)?shù)組初始化,,并使用sum_arr()函數(shù)計算總和:

// arrfun1.cpp -- functions with an array argument
#include <iostream>
int sum_arr(int arr[], int n);	// prototype
const int ArSize = 8;

int main()
{
	using namespace std;
	
	int cookies[ArSize] = {1, 2, 4, 8, 16, 32, 64, 128};
	
	// some systmes require preceding int with static to
	// enable array initialization

	int sum = sum_arr(cookies, ArSize);
	cout << "Total cookies eaten: " << sum << endl;
	
	return 0;
}

// return the sum of an integer array
int sum_arr(int arr[], int n)
{
	int total = 0;
	
	for (int i = 0; i < n; i++)
		total = total + arr[i];
	return total;
}

編譯輸出:

Total cookies eaten: 255

7.3.1 函數(shù)如何使用指針來處理數(shù)組

  • 大多數(shù)情況下,C++和C語言一樣,,將數(shù)組名視為指針,。C++將數(shù)組名解釋為其第一個元素的地址

cookies == &cookies[0]	// array name is address of first element

  • 首先,,數(shù)組聲明使用數(shù)組名來標(biāo)記存儲位置,。

    其次,對數(shù)組名使用 sizeof 將得到整個數(shù)組的長度,,以字節(jié)為單位,。

    最后,將地址運算符&用于數(shù)組名時,,將返回整個數(shù)組的地址,。 

int sum_arr[cookies, ArSize];

① 根據(jù)C++規(guī)則,,cookies是其第一個元素的地址,,因此函數(shù)傳遞的是地址。

② 由于數(shù)組的元素的類型為int,,因此cookies的類型必須為int指針,,即int*。

③ 正確的函數(shù)頭如下:

int sum_arr[int * arr, int n]	// arr = array name, n = size

④ C++中,,當(dāng)且僅當(dāng),,用于函數(shù)頭或函數(shù)原型中,int * arr 和 int arr[]的含義才是相同的,。它們都意味著arr是一個指針,。

⑤ 數(shù)組表示法 int arr[] 表明,,arr 不僅指向 int,而且指向 int 數(shù)組的第一個 int,。

⑤ 當(dāng)指針指向數(shù)組的第一個元素時,使用數(shù)組表示法,;而當(dāng)指針指向一個獨立的值時,,使用指針表示法。

7.3.2 將數(shù)組作為參數(shù)意味著什么

  • 函數(shù)調(diào)用 sum_arr(cookies, ArSize) 將cookies數(shù)組第一個元素的地址和數(shù)組中的元素數(shù)目傳遞給sum_arr()函數(shù),。sum_arr()函數(shù)將cookies的地址賦給指針變量arr,,將ArSize賦給變量n。這意味著,,實際上并沒有將數(shù)組內(nèi)容傳遞給函數(shù),,而是將數(shù)組的位置(地址)、包含的元素種類(類型)以及元素數(shù)目(n變量)提交給參數(shù),。

  • 傳遞常規(guī)變量時,,函數(shù)將使用改變量的拷貝;但傳遞數(shù)組時,,函數(shù)將使用原來的數(shù)組,。

  • 實際上,sum_arr()函數(shù)也傳遞了一個值,,這個值是一個地址,,而不是數(shù)組的內(nèi)容。

  • 將數(shù)組地址作為參數(shù)可以節(jié)省復(fù)制整個數(shù)組所需的時間和內(nèi)存,。另一方面,,使用原始數(shù)據(jù)增加了破環(huán)數(shù)據(jù)的風(fēng)險。

// arrfun2.cpp -- functions with an array argument
#include <iostream>
using namespace std;
int sum_arr(int arr[], int n);
const int ArSize = 8;

int main()
{
	int cookies[ArSize] = {1, 2, 4, 8, 16, 32, 64, 128};
	cout << cookies << " = array address, ";
	cout << sizeof(cookies) << " = sizeof cookies\n";
	
	int sum = sum_arr(cookies, ArSize);	
	cout << "Total cookies eaten: " << sum << endl;
	
	sum = sum_arr(cookies, 3);
	cout << "First three eaters ate " << sum << " cookies.\n";
	
	sum = sum_arr(cookies + 4, 4);
	cout << "Last four eaters ate " << sum << " cookies.\n";
	
	return 0;
}

// return the sum of an integer array
int sum_arr(int arr[], int n)
{
	int total = 0;
	cout << arr << " = arr, ";
	cout << sizeof(arr) << " = sizeof arr\n";
	
	for (int i = 0; i < n; i++)
		total = total + arr[i];
		
	return total;
}

編譯輸出:

0x6ffdf0 = array address, 32 = sizeof cookies
0x6ffdf0 = arr, 8 = sizeof arr
Total cookies eaten: 255
0x6ffdf0 = arr, 8 = sizeof arr
First three eaters ate 7 cookies.
0x6ffe00 = arr, 8 = sizeof arr
Last four eaters ate 240 cookies.

① 首先,,cookies和arr指向同一個地址,。

② 指針本身并沒有指出數(shù)組的長度,必須顯式傳遞數(shù)組長度,。

③ &cookies[4]和cookies + 4,;的含義相同,都表示數(shù)組中的第5個元素,。

7.3.3 更多數(shù)組函數(shù)示例

  • 接受數(shù)組名的函數(shù)將使用原始數(shù)據(jù),。為防止函數(shù)無意中修改數(shù)組的內(nèi)容,可在聲明形參時使用關(guān)鍵字const,。

void show_array(const double ar[], int n)

  • 此聲明表明,,指針ar[]指向的是常量數(shù)據(jù)。這意味著不能使用ar[]修改數(shù)據(jù),。但這并不意味著原始數(shù)組必須是常量,,而只是意味著不能在show_array()函數(shù)中使用ar來修改這些數(shù)數(shù)據(jù),。

  • 修改數(shù)組中的數(shù)據(jù)不需要返回值。

// arrfun3.cpp -- array functions and const
#include <iostream>
const int Max = 5;

// function prototypes
int fill_array(double ar[], int limit);
void show_array(const double ar[], int n);	//don't change data
void revalue(double r, double ar[], int n);

int main()
{
	using namespace std;
	double properties[Max];
	
	int size = fill_array(properties, Max);
	show_array(properties, size);
	if (size > 0)
	{
		cout << "Enter revaluation factor: ";
		double factor;
		while (!(cin >> factor))
		{
			cin.clear();
			while (cin.get() != '\n')
				continue;
			cout << "Bad input; Please enter a number: ";
		}
		revalue(factor, properties, size);
		show_array(properties, size);
	}
	cout << "Done.\n";
	cin.get();
	cin.get();
	
	return 0;
}

int fill_array(double ar[], int limit)
{
	using namespace std;
	double temp;
	int i;
	for (i = 0; i < limit; i++)
	{
		cout << "Enter value #" << (i + 1) << ": ";
		cin >> temp;
		if (!cin)
		{
			cin.clear();
			while (cin.get() != '\n')
				continue;
			cout << "Bad input; input process terminated.\n";
			break;
		}
		else if (temp < 0)
			break;
		else
			ar[i] = temp;
	}
	
	return i;
}

void show_array(const double ar[], int n)
{
	using namespace std;
	for (int i = 0; i < n; i++)
	{
		cout << "Property #" << (i + 1) << ": $";
		cout << ar[i] << endl;
	}
}

// multiplies each element of ar[] by r
void revalue(double r, double ar[], int n)
{
	for (int i = 0; i < n; i++)
		ar[i] *= r;
}

編譯輸出:

// first run
Enter value #1: 222000
Enter value #2: 100000
Enter value #3: 300000
Enter value #4: 560000
Enter value #5: 765000
Property #1: $222000
Property #2: $100000
Property #3: $300000
Property #4: $560000
Property #5: $765000
Enter revaluation factor: 0.25
Property #1: $55500
Property #2: $25000
Property #3: $75000
Property #4: $140000
Property #5: $191250
Done.

// second run
Enter value #1: 45678
Enter value #2: 567890
Enter value #3: 234567
Enter value #4: -2
Property #1: $45678
Property #2: $567890
Property #3: $234567
Enter revaluation factor: 0.56
Property #1: $25579.7
Property #2: $318018
Property #3: $131358
Done.

7.3.4 使用數(shù)組區(qū)間的函數(shù)

  • 給函數(shù)提供信息的方法

    ① 將指向數(shù)組起始處的指針作為一個參數(shù),,將數(shù)組長度作為第二個參數(shù)(指針指出數(shù)組的位置和數(shù)據(jù)類型)

    ② 指定元素區(qū)間(range),。可以通過傳遞兩個指針來完成:一個指針標(biāo)識數(shù)組的開頭,,另一個指針標(biāo)識數(shù)組的尾部,。STL方法使用“超尾”概念來指定區(qū)間。即標(biāo)識數(shù)組結(jié)尾的參數(shù)是指向最后一個元素后面的指針,。

double elboud[20];

① 指針elboud和elboud+20定義了區(qū)間,。數(shù)組elboud指向第一個元素。elboud+19指向最后一個元素,,即elound[19],。因此elboud+20指向數(shù)組結(jié)尾后面的一個位置。

② 將區(qū)間傳遞給函數(shù)將告訴函數(shù)應(yīng)處理哪些元素,。

// arrfun4.cpp -- functions with an array range
#include <iostream>
int sum_arr(const int * begin, const int * end);
const int ArSize = 8;

int main()
{
	using namespace std;
	
	int cookies[ArSize] = {1, 2, 4, 8, 16, 32, 64, 128};
	int sum = sum_arr(cookies, cookies + ArSize);
	cout << "Total cookies eaten: " << sum << endl;
	
	sum = sum_arr(cookies, cookies + 3);
	cout << "First three eaters ate: " << sum << " cookies.\n";
	
	sum = sum_arr(cookies + 4, cookies + 8);
	cout << "Last four eaters ate: " << sum << " cookies.\n";
	
	
	return 0;
}

// return the sum of an integer array
int sum_arr(const int * begin, const int * end)
{
	const int * pt;
	int total = 0;
	
	for (pt = begin; pt != end; pt++)
		total = total + *pt;
	return total;
}


編譯輸出:

Total cookies eaten: 255
First three eaters ate: 7 cookies.
Last four eaters ate: 240 cookies.

① 指針cookies + ArSize指向最后一個元素后面的一個位置,。

② 數(shù)組有ArSize個元素,因此cookies[ArSize-1]是最后一個元素,,其地址為cookies+ArSize-1,。因此,區(qū)間[cookies, cookies+ArSize]指定的是整個數(shù)組,。同樣cookies, cookies+3制定了前3個元素,。

③ 根據(jù)指針減法原則,end-begin是一個整數(shù)值,,等于數(shù)組的元素數(shù)目,。

④ 必須按正確的順序傳遞指針。begin在前面,,end在后面,。

7.3.5 指針和const

  • const修飾指針的兩種不同方式:

    ① 讓指針指向一個常量對象,防止使用該指針修改所指向的值,。

    int age = 39; const int * pt = &age; //*pt的值為const,,不能修改。pt指向age,,而age不是const,。可以直接通過age變量來修改age的值,。

    ② 將指針本身聲明為常量,,防止修改指針指向的位置。

  • 可以將const變量的地址賦給指向const的指針,但不能將const變量的地址賦給非const指針,。

  • 如果數(shù)據(jù)類型本身并不是指針,,則可以將const數(shù)據(jù)或非const數(shù)據(jù)的地址賦給指向const的指針,但只能將非const數(shù)據(jù)的地址賦給非const指針,。

  • 盡可能使用const

    ① 可以避免由于無意間修改數(shù)據(jù)而導(dǎo)致的編譯錯誤

    ② 使用const使得函數(shù)能夠處理const和非const實參,,否則將只能接受非cosnt數(shù)據(jù)。

如果條件允許,,則應(yīng)將指針形參聲明為指向const的指針,。

  • 通常,將指針作為函數(shù)參數(shù)來傳遞時,,可以使用指向const的指針來保護數(shù)據(jù)。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多