2010-10-01 40 views
10

Tôi mới tham gia C và vẫn cố gắng nắm bắt khái niệm về con trỏ. Tôi biết làm thế nào để viết một chức năng hoán đổi hoạt động ... Tôi quan tâm nhiều hơn đến lý do tại sao một trong những đặc biệt này không.Chức năng hoán đổi đơn giản ... tại sao cái này không hoán đổi?

void swap(int* a, int* b) 
{ 
int* temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(a, b); 
printf(“%d %d\n”), *a, *b); 
} 
+5

Câu hỏi rõ ràng sẽ là gì, sự khác biệt giữa triển khai này và triển khai của bạn hoạt động như thế nào? (Tôi biết vấn đề với cái này là gì, tôi chỉ đang cố gắng giúp bạn tìm ra nó.) [Tất nhiên, tất cả các hải ly háo hức trên SO đều sẵn sàng nhảy thẳng đến câu trả lời.] –

+1

Bài học về sự cố vững chắc khi vượt qua theo giá trị. Cảm ơn ppl. –

Trả lời

29

Bạn đang thiếu * s trong chức năng hoán đổi. Hãy thử:

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 

Bằng cách đó, thay vì chỉ trao đổi các con trỏ, bạn đang trao đổi các int s mà con trỏ đang trỏ -.

1

Con trỏ được chuyển theo giá trị. Điều này có nghĩa là & b vẫn là a và b khi trở lại từ hàm;

thử một cái gì đó như thế này

void swap(int* a, int* b) 
{ 
int temp = *a; 
*a = *b; 
*b = temp; 
} 
1

Cách đúng để làm điều đó:

void swap(int* a, int* b) 
{ 
    int temp = *a; // Temp is set to the value stored at a (5) 
    *a = *b;  // value stored at a is changed to the value stored at b (10) 
    *b = temp;  // value stored in address b is changed to 5. 
} 
2

C là một ngôn ngữ pass-by-value. Thói quen của bạn swap không dereference các con trỏ thông qua để nó, do đó, từ quan điểm của main không có gì đã xảy ra.

1

Nó hoán đổi. Nó hoán đổi các con trỏ cục bộ ab bên trong hàm swap. Nó hoán đổi chúng hoàn toàn tốt đẹp, như nó cần.

Nếu bạn muốn hoán đổi các giá trị mà các con trỏ này trỏ tới, bạn nên triển khai lại chức năng swap của mình, tức là làm cho nó hoán đổi các giá trị nhọn, chứ không phải con trỏ.

10

swap() Chức năng của bạn không làm việc, sau một thời trang - đó là giao dịch hoán đổi các giá trị của các biến ab đó là cục bộ đối swap(). Thật không may, những điều này khác với ab trong main() - vì vậy bạn không thực sự thấy bất kỳ ảnh hưởng nào từ việc hoán đổi chúng.

+0

Nó phải là câu trả lời được chấp nhận. –

0

Câu trả lời của zildjohn1 là cách dễ nhất và rõ ràng nhất để thực hiện. Tuy nhiên, nếu bạn nhấn mạnh vào việc trao đổi các con trỏ, thì bạn phải chuyển con trỏ tới con trỏ vì con trỏ chính nó được truyền theo giá trị.

4

Khi suy nghĩ về con trỏ, bạn cần phải rõ ràng về một vài trừu tượng.

Một đối tượng trong bộ nhớ. Đây có thể là bất kỳ loại (và kích thước) nào. Một đối tượng số nguyên, ví dụ, sẽ chiếm 4 byte trong bộ nhớ (trên các máy 32 bit). Một đối tượng con trỏ sẽ chiếm 4 byte trong bộ nhớ (trên các máy 32 bit). Như là hiển nhiên, đối tượng số nguyên giữ các giá trị nguyên; một đối tượng con trỏ chứa các địa chỉ của các đối tượng khác.

Ngôn ngữ lập trình C cho phép các biểu tượng (biến) đại diện cho các đối tượng này trong bộ nhớ. Khi bạn khai báo,

int i;

biểu tượng (biến) i đại diện cho một số đối tượng số nguyên trong bộ nhớ. Cụ thể hơn, nó đại diện cho giá trị của đối tượng này. Bạn có thể thao tác giá trị này bằng cách sử dụng i trong chương trình.

& tôi sẽ cung cấp cho bạn địa chỉ của đối tượng này trong bộ nhớ.

Đối tượng con trỏ có thể giữ địa chỉ của đối tượng khác. Bạn khai báo một đối tượng con trỏ bằng cách sử dụng cú pháp,

int * ptr;

Cũng giống như các biến khác, biến con trỏ biểu diễn giá trị của một đối tượng, một đối tượng con trỏ. Giá trị này chỉ xảy ra là địa chỉ của một số đối tượng khác. Bạn đặt giá trị của đối tượng con trỏ như vậy,

ptr = & i;

Bây giờ, khi bạn nói ptr trong chương trình, bạn đang đề cập đến giá trị của nó, đó là địa chỉ của i. Nhưng nếu bạn nói * ptr, bạn đang đề cập đến không phải là giá trị của ptr, mà đúng hơn là giá trị của đối tượng có địa chỉ trong ptr tức là i.

Sự cố với chức năng hoán đổi của bạn là bạn đang hoán đổi giá trị của con trỏ, không phải giá trị của các đối tượng mà các con trỏ này giữ địa chỉ. Để có được các giá trị của các đối tượng, bạn sẽ phải sử dụng * ptr.

0

Umm có thể sử dụng này

void swap(int** a, int** b) 
{ 
int** temp = a; 
a = b; 
b = temp; 
} 

int main() 
{ 
int x = 5, y = 10; 
int *a = &x, *b = &y; 
swap(&a, &b); 
printf(“%d %d\n”), *a, *b); 
} 
0

Nếu không sử dụng một biến thứ ba (temp)

void swap(int* a,int* b) 
{ 
// a = 10, b = 5; 
    *a = *a + *b; // a now becomes 15 
    *b = *a - *b; // b becomes 10 
    *a = *a - *b; // a becomes 5 
} 
-1

Bạn cần gửi địa chỉ của a và b cho chức năng trao đổi như vậy trong khi gọi hàm swap bạn phải gọi ass swap (& a, & b) Để bạn chuyển địa chỉ và thay đổi địa chỉ

-1
#define SWAP(a,b) ((a)=(b)+(a),(b)=(a)-(b),(a)=(a)-(b)) 

Hoạt động tốt.

Các vấn đề liên quan