我对使用指针有疑问 例如,我制作了这个交换程序并进行交换,所以我必须使用指针来维护发生交换时的相同地址
#include<stdio.h>
int swap(int *x,int *y); //swapping function
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("A->%d,B->%d\n",a,b); //print original array
swap(&a,&b); //pass by reference
printf("A->%d,B->%d\n",a,b); //print sorted array
}
int swap(int *x,int *y)
{
int temp; // Swapping
temp =*x;
*x=*y;
*y=temp;
}
然后我写了一个合并排序程序。在这里我只是在函数中传递了值(传递值),而没有使用指针,但是当我在main函数中打印已排序的数组时,它被排序。
#include<stdio.h>
void merge(int a[],int start,int mid,int end); //Sorting and merging lists
void mergesort(int a[],int start,int end); //Dividing the list
int main()
{
int size,i;
scanf("%d",&size);
int arr[size];
for(i=0;i<size;i++) //Input array
{
scanf("%d",&arr[i]);
}
printf("Array is: ");
for(i=0;i<size;i++)
{
printf("%d ",arr[i]); //print original array
}
printf("\n");
mergesort(arr,0,size-1); //Mergesort call-pass by value
printf("Sorted Array is: ");
for(i=0;i<size;i++)
{
printf("%d ",arr[i]); //print sorted array
}
printf("\n");
}
void mergesort(int a[],int start,int end)
{
int mid;
if(start<end)
{
mid=(start+end)/2; //calculating mid and dividing array recursively
mergesort(a,start,mid);
mergesort(a,mid+1,end);
merge(a,start,mid+1,end);
}
}
void merge(int a[],int start,int mid,int end)
{
int b[end]; //auxillary array
int i;
int p=start,q=mid,k=start;
while((p<mid) && (q<=end)) //comparing both list
{
if(a[p]<=a[q])
{
b[k++]=a[p++];
}
else
{
b[k++]=a[q++];
}
}
while(p<mid) //adding remaing items to auxillary array
{
b[k++]=a[p++];
}
while(q<=end) //adding remaing items to auxillary array
{
b[k++]=a[q++];
}
for(i=start;i<k;i++) //copying items from auxillary array to original array
{
a[i]=b[i];
}
}
为什么会这样?
答案 0 :(得分:1)
您无法通过C中的值直接传递数组(您可以做的最好是在结构中包装固定大小的数组)。在参数列表中,int a[]
完全等同于int *a
。
所以你正在使用指针,这就是数组排序的原因。
答案 1 :(得分:1)
在C和类似语言中,函数参数的第一个数组维度被重写为指针。所以你的界面
void merge(int a[],int start,int mid,int end);
void mergesort(int a[],int start,int end);
与
完全相同void merge(int* a,int start,int mid,int end);
void mergesort(int* a,int start,int end);
所以实际上对于数组,你总是将地址传递给你的函数。
答案 2 :(得分:1)
我不知道你为什么这么说:
这里我只是在函数中传递值(传递值)而不使用指针。
因为,当你使用
时mergesort(int a[],int start,int end)
merge(int a[],int start,int mid,int end)
然后a[]
与使用*a
时相同。它正在使用指针方式。