首页 > 解决方案 > 函数中的变量是一个数组,但在 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 
}

标签: arrayscpointersrecurrencefunction-declaration

解决方案


具有此函数声明中的数组类型的函数参数

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 );
}

看来你的老师不是一个合格的程序员。至少使用大写字母作为局部变量的标识符是一种糟糕的编程风格。


推荐阅读