函数如何使用指针来处理数组
在大多数情况之下,C++也和C语言一样,也将数组视为指针。C++将数组名视为其第一个元素的地址。
cookies=&cookies[0];
该规则有些例外,首先,数组要声明使用数组名来标记存储位置,其次,对数组名使用sizeof将得到整个数组的长度。而如果将大小运算方法用到数组的名字上面的时候,他返回的就会是整个数组在内存中空间的大小。
int sum=sum_arr(cookies,ArSize);
其中,cookie是数组名,而更具C++规则,cookies是其第一个元素的地址,因此函数传递的是地址。由于数组的元素类型为int。因此cookie的类型必须是int类型。这表明,正确的函数头应该是这样的:
int sum_arr(int * arr,int n);
其中用int *arr替换了int arr[].这表明这两个函数头都是正确的。因为在C++中,当(并且仅当)用于函数头或者函数原型中的时候。int *arr 和int arr[]的含义才是相同的。他意味着arr是一个int类型的指针。数组表示法提醒用户。arr不仅指向int。还指向int数组的第一个int。
arr[i] == *(arr+i);
&arr[i] == arr+i
记住,将指针(包括数组名)加1,实际上是加上了一个与指针指向类型的长度(以字节为单位)相等的值。对于遍历数组而言。使用指针加法和数组下标是相等的。
在C++传递一个数组的时候,并没有将实际的数组内容传递给函数,而是将数组的位置(地址)、包含的元素种类(类型),以及元素的数目(n变量)提交给了函数。有了这些信息后,函数就可以使用原来的数组。传递常规变量的时候,函数将使用该变量的拷贝。但传递数组的时候。函数将继续使用原来的数组。实际上,这种区别并不违反C++按值传递的方法。sum_arr()函数仍然传递了一个值。这个值被赋值给一个新的变量。但这个值是一个地址,而不是数组的内容。