arrays - 函数中的变量是一个数组,但在 C 中调用它时使用了指针
问题描述
我正在查看老师的代码,有些东西我无法理解。
这是一个递归函数,用于计算数组中数字的总和。在函数变量中,有一个数组,但是在返回语句中调用它时,使用了指针符号。(&A[1] 和 A+1)。
我不明白为什么这段代码有效,为什么当我将函数变量更改为int *A[]
这是代码。非常感谢。
int sum( int A[], int size ){
if( size == 0 ) return 0;
print_array( A, size );
//return A[ size - 1 ] + sum( A, size - 1 );
//return A[ 0 ] + sum( A + 1, size - 1 );
return A[ 0 ] + sum( &A[ 1 ], size - 1 );
// n! is n times (n-1)!
// sum of the elements is first element plus sum of the rest
}
解决方案
具有此函数声明中的数组类型的函数参数
int sum( int A[], int size );
由编译器调整为指向元素类型的类型指针。也就是这两个函数声明
int sum( int A[], int size );
int sum( int *A, int size );
声明相同的一个函数。
在函数sum
中,变量A
是类型的指针int *
。
另一方面,当您将数组作为参数表达式传递时,它又会隐式转换为指向其第一个元素的指针。
至于这个问题
我不明白为什么这段代码有效,为什么当我将函数变量更改为 int *A[] 时它不起作用
那么这个参数声明int * A[]
意味着一个未知大小的指针数组int
。编译器将调整此参数声明,如int ** A
. 但是根据函数定义,该函数需要一个整数数组而不是指向整数的指针数组作为参数。+
此外,没有为指针定义加法运算符。
您问题中提供的函数应按以下方式声明和定义
long long int sum( const int a[], size_t size )
{
return n == 0 ? 0 : *a + sum( a + 1, n - 1 );
}
看来你的老师不是一个合格的程序员。至少使用大写字母作为局部变量的标识符是一种糟糕的编程风格。
推荐阅读
- here-api - Here Maps Api for Javascript 3.1 - 非常慢
- javascript - html2canvs 如何循环或重用多个 div/html dom 元素
- python - EMR 笔记本不存在 IAM 角色
- angular - 使用 const { } 时哪些属性会暴露在外部
- python - 无法使用 python 3.8 安装 cvxpy
- laravel - 如何在 Laravel/Lighthouse/Passport/Nuxt 应用程序上使用 Dusk 测试登录?
- git - 如何可靠地确定远程存储库中的最后提交日期?
- javascript - 无法在 vue 图像 src 绑定中使用波浪号 (~)
- android - 添加 ClickListener 时出现 NullPointerException
- assembly - 如何在 ARM Assembly 中将大写字母转换为小写字母?