具有c ++背景知识的c编码的新手。我有一个简单的程序,使用函数对数组进行排序。我需要通过引用将int指针传递给sort()函数,以便编译器不会创建副本,并且在函数调用后将对数组进行排序。如果我不传递引用,则函数结束后,数组将保持未排序状态。
#include <stdio.h>
#include <stdlib.h>
void sort(int* & arr, int s, int e)
{
int temp = 0, i, j;
for (i=0;i<e;i++)
{
for (j=i+1;j<e;j++)
{
if (*arr[i]>*arr[j])
{
temp = *arr[i];
*arr[i] = *arr[j];
*arr[j] = temp;
}
}
}
}
int main()
{
int* arr = malloc(sizeof(int)*10);
int i;
for (i=0;i<10;i++)
arr[i] = i+1;
printf("Array before sorting:\n");
for (i=0;i<10;i++)
printf("%d ", arr[i]);
printf("\n");
sort(arr, 0, 10);
printf("Array after sorting:\n");
for (i=0;i<10;i++)
printf("%d ", arr[i]);
printf("\n");
return 0;
}
我还知道c不允许在函数中进行引用传递,那么如何解决此问题?
答案 0 :(得分:4)
在C语言中,通过传递指向所需类型的指针来模拟按引用传递。这意味着如果您有一个int *
要传递给可以修改的函数(即,在调用方中可以看到对int *
的更改),则该函数应接受一个{{1 }}。
但是,在您的特定情况下,这不是您想要的。您只需要将int **
传递给函数,然后它就可以通过int *
运算符隐式取消引用并更改数组的元素。
[]
答案 1 :(得分:1)
在C语言中没有引用。
将指针传递给函数将不会复制该指针指向的对象。
void foo(int* array);
然后可以通过延迟指针访问元素。
int a = *array; //dereferencing the pointer. Getting the first element.
int b = array[0]; // does the same thing.
int c = *(array + 1) // second element. Pointer shifts by 1 * sizeof(type) bytes
int d = array[1] // second element again
传递这样的指针与传递带有字长的整数(因为指针只是其下的整数)具有相同的开销。
如果要将指针传递给数组,则应将其作为双指针**
传递。由于您可以在函数中更改指针,因此几乎可以用作传递它的引用。
用例:
void foo(int** array) // passing a double pointer
{
//....
*array = theNewCollection;
//...
}
调用此函数的方式应为
int* arr = malloc(sizeof(int)*10);
foo(&arr);