SubArray,将地址传递给函数

时间:2013-06-12 12:31:59

标签: c memory-address

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

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

2 个答案:

答案 0 :(得分:4)

每当你有这样的功能时:

void f(int b[]);

这与

相同
void f(int *b);

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

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

array[index]

这与

相同
*(array+index)

无论array是真实数组还是指针都无关紧要。

因此&b[1]&*(b+1)相同,与b+1相同。

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

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

    selectionSort( b+1, size-1 );

    .
    .
    .
}

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

答案 1 :(得分:2)

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

指向整数数组的指针

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

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

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