2016-07-10 53 views
-1

我在使用指針 例如有疑問我在此交換程序和交換,所以我有爲了保持相同的地址使用指針,其中交換正在發生指針在C,而使用陣列和交換功能

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

然後我寫了一個合併排序的程序。在這裏,我只是在函數中傳遞值(通過值傳遞)而不使用指針,但是當我在主函數中打印排序後的數組時,它將被排序。

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

這是怎麼發生的?

+5

請格式化您的代碼。 –

+1

對於int_swap,你應該使用'void'而不是'int',因爲它實際上並沒有返回任何東西。 – RoadRunner

+0

int arr [size];是無效的陳述。 – dreamBegin

回答

1

你不能直接按C中的值傳遞數組(最好你可以做的就是在一個結構中包裝一個固定大小的數組)。在參數列表中,int a[]int *a完全相同。

所以你正在使用指針,這就是爲什麼數組排序。

+0

thnx我不知道 – INDER

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); 

所以實際上對於數組,你總是一個地址傳遞給你的函數。

+0

thnx我不知道 – INDER

1

我不知道爲什麼你說:

在這裏,我只是通過在funtions值(按值傳遞),而無需使用指針。

因爲,當您使用

mergesort(int a[],int start,int end) 
merge(int a[],int start,int mid,int end) 

然後a[]是當你使用*a相同。它使用指針的方式。

+0

thnx我不知道 – INDER

+0

繼續前進! – lampv

+0

請了解如何使用Markdown。它會大大改善你的帖子。例如,不要使用'
'來換行;相反,在你想要段落中斷的地方放上兩條換行符,並用四個空格縮進來構成一個代碼塊。 –