在大多数情况下,c++和C语言一样,也将数组名视为指针。另外C++将数组名解释未其第一个元素的地址。
?? ?int cookies[10];
?? ?其中cookies = &cookies[0] // 数组名时第一个元素的地址
?? ?
?? ?该规则有一些例外。
?? ?首先,数组声明使用数组名来标记存储位置;
?? ?其次,对数组名使用sizeof将得到整个数组的长度(以字节为单位);
?? ?第三,将地址运算符&用于数组名时,将返回整个数组的地址。
?? ?
?? ?int sum = sum_arr(cookies, ArSize);
?? ?其中cookies是数组名,而根据C++规则,cookies是其第一个元素的地址,因此函数传递的是地址。由于数组的元素的类型为int,因此cookies的类型必须是int指针,即int*。这表明,正确的函数头应该是这样的。
?? ?int sum_arr(int* arr, int n) // arr是数组的名字,n是数组大小
?? ?
?? ?其中用int* arr替换了int arr[]。 这证明这两个函数头都是正确的,因为在C++中,当(且仅当)用于函数头或函数原型中,int*和int arr[]的含义才是相同的。它们都意味着arr是一个int指针。然而,数组表示法(int arr[])提醒用户,arr不仅指向int,还指向int数组的第一个int。更多情况下为了使用不易混淆,我们将当指针指向数组的第一个元素时,使用数组表示法;而当指针指向一个单独的值时,使用指针表示法。
示例源码:
// Len_array.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
using namespace std;
int sum_arr1(int* arr, int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum = sum + arr[i];
}
return sum;
}
int sum_arr2(int arr[], int n)
{
int sum = 0;
for (int i = 0; i < n; i++)
{
sum = sum + arr[i];
}
return sum;
}
int main()
{
int cookies[10] = { '0' };
for (int i = 0; i < 10; i++)
{
cookies[i] = rand()%10;
}
printf("\n原始数据:");
for (auto i : cookies)
cout << i << " ";
int sum1 = sum_arr1(cookies, 10);
printf("\n\n使用sum_arr1:%d", sum1);
int sum2 = sum_arr1(cookies, 10);
printf("\n\n使用sum_arr2:%d", sum2);
}
执行结果: