使用数组和交换功能时在C中指针

时间:2016-07-10 15:14:21

标签: c mergesort

我对使用指针有疑问 例如,我制作了这个交换程序并进行交换,所以我必须使用指针来维护发生交换时的相同地址

#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];
 }
}

为什么会这样?

3 个答案:

答案 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时相同。它正在使用指针方式。