问题描述
我正在查看我老师的代码,但有一些我无法理解的地方。
这是一个递归函数,用于计算数组中数字的总和。在函数变量中,有一个数组,但在 return 语句中调用它时,使用了指针符号。 (&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 );
}
看来你的老师不是合格的程序员。至少使用大写字母作为局部变量的标识符是一种糟糕的编程风格。
,因为 &A[1]
指的是地址,而 *A[1]
指的是位于地址 A[1]
的值。而 sum()
函数需要一个指向数组及其大小的指针。