这是排序算法的简单实现。我的问题是。数组numbers
在Main中声明并初始化。然后,我像函数sort
中的参数一样传递(是副本?)。在sort
函数中,numbers
,现在称为array
(据我所知,副本)已更改(排序)。因此,为什么在调用函数后,阵列numbers
已更改(这是我想要的,买是要知道为什么?。 array
范围在sort
中,而不是main
。
int main(void)
{
int numbers[SIZE] = { 4, 15, 16, 50, 8, 23, 42, 108 };
for (int i = 0; i < SIZE; i++)
printf("%d ", numbers[i]);
printf("n");
sort(numbers, SIZE);
for (int i = 0; i < SIZE; i++)
printf("%d ", numbers[i]);
printf("n");
return 0;
}
void sort(int array[], int size)
{
int swaps = 0;
while(swaps==0)
{
for(int i = 0; i < size ; i++)
{
for(int j = i + 1; j < size ; j++)
{
if( array[i] > array[j] )
{
// Swapping
int temp = array[i];
array[i] = array[j];
array[j] = temp;
swaps ++;
}
}
}
}
}
int array[]
与 int *array
相同。您正在通过指针。
您已通过参考传递数组,因此任何操作都会影响内存中的该位置。
void sort(int array[], int size)
传递了对数组的引用,即您正在传递指针(正如@pst正确指出的那样,这不是 exkeck> exact 术语,c始终按值传递) - 不是数组的副本。您进行的任何修改都会修改原始数组。
如果您不想修改原始数组,请复制并传递副本。
另一种(更高效)的方法是从呼叫者分配,然后将指针传递给函数:
void sort(int *const array,int [] result, int size)
如果您的算法不需要"到位",这特别方便。
请注意,在函数内创建副本并将指针传递给复制值,因为返回值在技术上是可行的,但确实确实灰心
- 您不能在功能中分配int []并返回因为它将超出范围
- 您可以做一个malloc,但是您必须记住将其从中释放出来呼叫者功能,很容易忘记
在C中,有两种不同的方法将参数传递给函数/方法。 - 传递值 - 通过指针
传递值的优点是将副本提供给可以修改的函数。缺点(对于大对象)是由于需要复制数据而慢。
传递指针比复制值更快(比复制大对象)要快得多。但是,如果调用函数会修改该值,则原始变量也会更改。有时是故意完成的(例如,在您的排序功能或返回多个值的函数中)。
编辑: 显然我在这里混合了一些东西,所以我试图解决此问题...最初我是在谈论"通过参考"one_answers"按值调用",但C实际上是C不支持参考。阅读评论以获取更多详细信息。