2009-11-03 54 views
5

Tôi phải sử dụng con trỏ để hoán đổi int trong một mảng. Nó biên dịch không có lỗi hoặc cảnh báo và chạy nhưng không hoán đổi int. Bất kỳ đề nghị sẽ là hữu ích!!!Sử dụng con trỏ để hoán đổi các giá trị mảng int

Dưới đây là các thử nghiệm:

#import <stdio.h> 

void swap(int ary[]); 

int main( int argc, char*argv[]) 
{ 
    int ary[] = { 25, 50 }; 
    printf("The array values are: %i and %i \n", ary[0], ary[1]); 
    swap(ary); 
    printf("After swaping the values are: %i and %i \n", ary[0], ary[1]); 

    return 0; 
} 

Dưới đây là chức năng hoán đổi:

void swap(int ary[]) 
{ 
    int temp = *ary; 
    *ary = *(ary + 1); 
    *ary = temp; 
} 

Đây là những gì được hiển thị sau khi chạy:

The array values are: 25 and 50 
After swaping the values are: 25 and 50 

Trả lời

16

Tôi ghét làm hỏng điều này nhưng có vẻ như lỗi đánh máy hơn bất cứ thứ gì.

Trong chức năng trao đổi của bạn:

*ary = temp; 

nên là:

*(ary + 1) = temp; 

chỉnh sửa: Có một lý do bạn không sử dụng ký hiệu mảng? Tôi nghĩ rằng đó là một chút rõ ràng hơn cho những thứ như thế này:

int temp = ary[0]; 
ary[0] = ary[1]; 
ary[1] = temp; 
+1

wow tôi cảm thấy ngu ngốc bây giờ! –

+1

Tôi nghĩ tất cả chúng ta đều ở đó. –

+2

Thật vậy, sử dụng '[]', nó sạch hơn nhiều. – GManNickG

5

Kiểm tra chức năng trao đổi của bạn một cách cẩn thận hơn :

void swap(int ary[]) 
{ 
    int temp = *ary; 
    *ary = *(ary + 1); 
    *ary = temp; 
} 

Khi nào *(ary + 1) được chỉ định đến?

4

Bạn di chuyển giá trị thứ hai vào vị trí đầu tiên, và sau đó di chuyển giá trị đầu tiên trở lại vị trí đầu tiên.

0

Hãy thử điều này thay vì:

void swap(int ary[]) 
{ 
    int temp = ary[0]; 
    ary[0] = ary[1]; 
    ary[1] = temp; 
} 
+0

Tôi biết làm thế nào để làm điều đó với ký hiệu mảng nhưng chúng tôi đã được yêu cầu sử dụng con trỏ. –

+0

@ Josg tôi sẽ mở một chút bí mật cho bạn. Bạn có thể ký hiệu [], và thực hiện điều, các trình biên dịch thực hiện: a [x] = * (a + x) = x [a]. YEAH! đó là một chút c-trick về một [x] = x [a], gây ra trình biên dịch không sử dụng [] -method. – f0b0s

+0

tôi có nghĩa là bạn có thể lấy mã của Peter và chỉnh sửa nó một chút: arr [1] -> * (arr + 1) – f0b0s

4

chỉ để cho vui; Nó cũng có thể trao đổi mà không sử dụng một giá trị tạm thời

void swap(int ary[]) 
{ 
    *ary ^= *(ary + 1); 
    *(ary + 1) ^= *ary; 
    *ary ^= *(ary + 1); 
} 

Như GMAN chỉ ra, mã này làm lu mờ ý định của bạn từ trình biên dịch và bộ vi xử lý, do đó hiệu suất có thể tồi tệ hơn so với sử dụng một biến tạm thời, đặc biệt trên hiện đại CPU.

+0

Nhà điều hành '^ =' làm gì ở đây? Không bao giờ thấy nó được sử dụng trước –

+0

'^' là độc quyền hoặc, vì vậy 'x^= y' có nghĩa là' x = x^y' –

+1

^là một bit XOR. 0^0 = 0 1^1 = 0 1^0 = 0 0^1 = 0 – f0b0s

0

chức năng trao đổi của bạn sẽ làm việc chỉ dành cho mảng 2 ints, vì vậy hiển thị nó để biên dịch của bạn (nó sẽ không thay đổi bất cứ điều gì, nhưng làm cho mã sạch)

void swap(int ary[2]) 
+0

-1 điều này không thực hiện bất cứ điều gì, và thực sự không giúp đỡ bất cứ ai trong thời gian dài. "Mã rõ ràng hơn" của bạn để cố gắng giúp chúng tôi hiểu ý định của bạn là không thay thế cho tài liệu phong nha. –

2

Bạn cũng có thể trao đổi các giá trị mà không cần bất kỳ biến tạm thời:

void swap(int *x, int *y) 
{ 
    *x ^= *y; 
    *y ^= *x; 
    *x ^= *y; 
} 

sau đó gọi:

swap(&ary[0], &ary[1]); 
Các vấn đề liên quan