我有一个关于将数组的第一个元素的地址传递给(递归)函数的问题:
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 );
}
}
答案 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 );