4

我有一个关于将数组的第一个元素的地址传递给(递归)函数的问题:

selectionSort( &b[1], size-1);

当地址传递给函数时,函数参数必须是我知道的指针。selectionSort方法int b[]作为参数。不是指针。

但是代码可以正常工作。此代码还生成子数组。当我们传递第一个元素时,它是否成为子数组的第零个元素?

void selectionSort(int b[], int size)
{
    int temp,i;

    if (size>=1) 
    {
        for (i = 0; i < size; i++)
        {
            if (b[i]<b[0])
            {
                temp=b[0];
                b[0]=b[i];
                b[i]=temp;
            }
        }
        selectionSort( &b[1], size-1 );  
    }
}
4

2 回答 2

4

每当您具有以下功能时:

void f(int b[]);

这和

void f(int *b);

函数参数的[]语法只是一种特殊的语法,让读者知道你打算像数组一样使用参数,但它实际上只是一个指针。您不能将实际数组传递给函数。指针和数组在 C 中的工作方式非常相似,因此在大多数情况下,您可以像处理数组一样使用指针(但要小心——也有重要的例外)。

例如,当您像这样访问数组的元素时:

array[index]

这和

*(array+index)

array是一个真正的数组还是一个指针都没有关系。

So&b[1]与 相同&*(b+1),与 相同b+1

如果我们要编写代码,以便将b参数视为指针,它将如下所示:

void selectionSort(int *b, int size){
    .
    .
    .

    selectionSort( b+1, size-1 );

    .
    .
    .
}

现在,您可以看到它selectionSort被传递了一个指向 int 的指针,并且它使用指向下一个 int 的指针调用自身。

于 2013-06-12T12:35:46.380 回答
2

是的,代码将创建您应该使用的“子数组”:

指向整数数组的指针

 selectionSort(int (*b)[], int size)

并使用以下方法调用该函数:

selectionSort( &b[1], size-1 );  
于 2013-06-12T12:34:31.350 回答