函数中的变量是一个数组,但在 C 中调用它时使用了指针

问题描述

我正在查看我老师的代码,但有一些我无法理解的地方。

这是一个递归函数,用于计算数组中数字的总和。在函数变量中,有一个数组,但在 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 中,变量 Aint * 类型的指针。

另一方面,当您将数组作为参数表达式传递时,它又会隐式转换为指向其第一个元素的指针。

关于这个问题

我不明白为什么这段代码有效,为什么在 我把函数变量改成 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() 函数需要一个指向数组及其大小的指针。