参数传递给函数时,实际上只有数组的首地址作为指针传递给了函数。
在函数定义中的int a[ ]等价于int *a。在只有地址信息的情况下,是无法知道数组里有多少个元素的,因此在计算数组中的元素和时,要加一个参数——数组的元素个数。
- #include
- //#include
- #include
- int sum(int* a, int n) {
- int ans = 0;
- for (int i = 0; i < n; i++)
- ans += a[i];
- return ans;
- }
-
-
- /*在函数调用时,a不一定非要传递一个数组,例如:*/
- int main() {
- int a[] = { 1,2,3,4 };
- printf("%d\n", sum(a + 1, 3)); //利用指针的加减法把要开始相加元素的地址传给函数
- return 0;
- }
一般地,若p是指针,k是正整数,则p+k就是指针p后面第k个元素,p-k是p前面的第k个元素,而如果p1、p2 是同类型的指针,则p2-p1是从p2到p1的元素个数(不含p2)
写法一:
- #include
- //#include
- #include
- int sum(int* begin, int* end) {
- int n = end - begin;
- int ans = 0;
- for (int i = 0; i < n; i++)
- ans += begin[i];
- return ans;
- }
- /*测试函数————计算左闭右开区间内的元素和:*/
- int main() {
- int a[] = { 1,2,3,4 };
- printf("%d\n", sum(a + 1, a+3)); //利用指针的加减法把要开始相加元素的地址传给函数
- return 0;
- }
写法二:更具一般性,用一个新指针p作为循环变量,同时累加其指向的值
- #include
- //#include
- #include
- int sum(int* begin, int* end) {
- int* p = begin;
- int ans = 0;
- for (int* p = begin; p != end; p++)
- ans += *p;
- return ans;
- }
- /*测试函数————计算左闭右开区间内的元素和:*/
- int main() {
- int a[] = { 1,2,3,4 };
- printf("%d\n", sum(a + 1, a+3)); //利用指针的加减法把要开始相加元素的地址传给函数
- return 0;
- }
数组在传参时的注意点
1. 数组传递的方式: 在C语言中,数组的传递通常使用指针来实现。当你传递一个数组作为函数参数时,实际上传递的是数组的首地址,也就是数组的第一个元素的地址。函数中可以通过指针来访问和修改数组中的元素。这种传递方式可以避免在内存中复制整个数组,提高了效率。
2. 数组大小的传递:在函数中传递数组时,通常需要额外传递数组的大小信息,以便函数知道数组的长度。这样可以避免在函数内部发生数组越界的错误。可以通过传递数组大小作为参数,或者在数组的末尾使用一个特定的值来表示数组的结束。
3. 数组的修改: 在函数中传递数组时,函数可以修改数组中的元素。这是因为数组传递的是数组的地址,函数可以通过指针来访问和修改数组中的元素。注意,在函数内部修改数组的元素会对原始数组产生影响。
4. 数组的长度限制: 在C语言中,数组的长度是固定的,一旦定义了数组的大小,就不能再改变。因此,在传递数组时需要确保函数中不会越界访问数组。如果需要处理可变长度的数据,可以考虑使用动态内存分配(如“malloc”和“free”)来创建和释放数组。
5. 数组的一维和多维传递:对于一维数组,可以直接将数组作为参数传递给函数。而对于多维数组,需要指定每个维度的大小,并使用适当的方式进行传递。可以使用指针或者使用数组指定每个维度的大小。
参考书籍:《算法竞赛入门经典(第二版)》作者:刘汝佳