参考
C++ Primer Plus (第6版)
函数与数组
数组作为函数参数
数组作为形参
#include <iostream>
using namespace std;
/*
n为数组的长度,sizeof 一个指针 是得不到数组的长度, 需要传入数组的长度
*/
int sum_arr(int arr[], int n)
{
int total = 0;
for (int i = 0; i < n; i++)
{
total += arr[i];
}
return total;
}
int main()
{
int cookies[8] = { 1,2,4,8,16,32,64,128 };
cout << sum_arr(cookies, 8) << endl; // 255
system("pause");
return 0;
}
在c++规则中,cookies是其第一个元素的地址,也就是在
sum_arr(cookies, 8)
第一个参数传入的参数是一个数组的地址,那么这表明正确写法应该是
int sum_arr(int* arr, int n)
在c++中,当且仅当用于函数头或函数原型中,int *arr 和 int arr[] 的含义相同,都是指向一个int指针(java不同,且定义数组不要和c++弄混)
数组名和指针对应好处: 作为参数,可以节省复制整个数组的时间和内存
数组名和指针对应坏处: 原始数据会被破坏,用const防止破坏
void show_array(double* arr, int n)
{
arr[0] += 10;
}
int main()
{
double constArray[2] = { 12,13 };
show_array(constArray, 2);
for (int i = 0; i < 2; i++)
{
cout << constArray[i] << endl; // 22,13
}
}
用const ,如果对数组进行修改操作,编译器会禁止这么做
不需要传入数组长度,也就是把数组起始地址和结束地址为参数传入函数
#include <iostream>
using namespace std;
int sum_arr(const int* begin, const int* end)
{
const int* ptr = begin;
int total = 0;
for (; ptr != end; ptr++)
{
total += *ptr;
}
return total;
}
int main()
{
int cookies[8] = { 1,2,4,8,16,32,64,128 };
cout << sum_arr(cookies, cookies + 8) << endl; // 255
system("pause");
return 0;
}
数组为二维数组
跟一维数组同理,参数也就是指针指向数组
在c++中,当且仅当用于函数头或函数原型中,int (arr)[i] 和 int arr[][i] 的含义相同,都是指向一个int[i]指针,不要忘记给arr加上括号,不然就是i个指向int的指针
#include <iostream>
using namespace std;
int sum(int(*ar2)[4], int size)
{
int total = 0;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < 4; j++)
{
total += ar2[i][j];
}
}
return total;
}
int sum2(int ar2[][4], int size)
{
int total = 0;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < 4; j++)
{
total += ar2[i][j];
}
}
return total;
}
int main()
{
int data[3][4] = { {1,2,3,4},{5,6,7,8},{2,4,5,6} };
cout << sum(data, 3) << endl; // 53
cout << sum2(data, 3) << endl; // 53
system("pause");
return 0;
}
数组作为函数的返回值
返回值也就是指针,推荐参数引用
不然容易出现问题,比如
在函数内定义静态数组,出了函数,return的指针就释放了
上一篇:c++基础 数组(一)
下一篇:c++基础 数组(三)