2013-06-24 71 views
2

我試圖在這個問題上有一個裂縫。問題說,*「swap_nums似乎工作,但不swap_pointers。修復它。」*我是一個初學者的方式:)C中的指針(將地址傳遞給函數)

我相信我可以解決自己的問題,但麻煩是我有一個在C中理解一些編程概念有點困難。在這裏我已經給出了需要編輯的給定代碼。在此之下,我會展示我的思維過程。請注意:我需要一些提示而不是完整的解決方案。 :-)

#include <stdio.h> 
#include <stdlib.h> 

void swap_nums(int *x, int *y); 
void swap_pointers (char *x, char *y); 

int main (int argc, char *argv[]){ 

    int a = 3, b = 4; 
    char *s1, *s2; 
    swap_nums(&a, &b); 
    printf("a is %d\n", a); 
    printf("b is %d\n", b); 

    s1 = "I should print second"; 
    s2 = "I should print first"; 

    swap_pointers(s1, s2); 
    printf("s1 is %s\n", s1); 
    printf("s2 is %s\n", s2); 

    return EXIT_SUCCESS; } 

void swap_nums(int *x, int *y){ 

    int temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; } 

void swap_pointers (char *x, char *y){ 

    char *temp; 
    temp = x; 
    x = y; 
    y = temp; } 

我的思考過程:這是一個程序,我相信會交換整數變量a和b。然後它將採用兩個聲明的字符串並交換它們。

主要功能:

int a = 3, b = 4; 

分配變量a和b分別3和4。

char *s1, *s2; 

創建一個字符指針變量(其將保持字符的地址)

swap_nums(&a, &b); 

功能swap_nums正在發生。我現在要去解釋我的思維過程。

void swap_nums(int *x, int *y){ 

所以我不熟悉將函數傳遞到函數中,如果我在這裏錯了,是否有人能夠糾正我要說的話?

我看到它的方式,我們將a和b的地址傳遞給函數swap_nums。但是,我們如何得到int * x和int * y?我在這裏有點困惑。有人可以向我解釋這一點嗎?

回答

0

指針可能是一個地址,但它仍然通過值傳遞給函數(如C中的所有東西)。要交換兩個指針,您需要指向指針的指針。


這裏有你想要的東西:

#include <stdio.h> 

int main(void) 
{ 
    char x='s'; 
    char y='o'; 
    char *a = &x; 
    char *b = &y; 
    printf("a is %x\n",a); 
    printf("b is %x\n",b); 
    printf("swapping\n"); 
    swap_pointers(&a,&b); 
    printf("a is %x\n",a); 
    printf("b is %x\n",b); 

} 

void swap_pointers(char **a, char **b) 
{ 
    char *temp; 
    temp = *a; 
    *a = *b; 
    *b = temp; 
} 
0

這裏是一個暗示,有什麼不對的:

s1 = "I should print second"; 
s2 = "I should print first"; 

什麼是s1的類型,什麼是「我應該打印第二個」?以及如何將字符串文字保存到變量?

8

在C中,一切都作爲值傳遞,包括指針。因此,交換指針的代碼會操縱指針副本,從而保持原來的狀態不變。

爲了交換指針,您需要將指針傳遞給指針,而不是簡單的指針。當然,裏面的功能,你需要解引用您在swap_numbers做了同樣的方法添加的級別:

void swap_pointers (char **x, char **y) { 
    char *temp; 
    temp = *x; 
    *x = *y; 
    *y = temp; 
} 
+0

絕對正確。如果你想變得有趣,你也可以XOR交換它們;){if(x!= y){* x = * x^* y; * y = * x^* y; * x = * x^* y; }} –

0

提示:通過價值分析呼叫,並通過引用調用,讓您的查詢清楚的認識。

0

想到指針只是另一個變量,我們必須將一個指針傳遞給函數swap_pointers()

0

這就是你需要我猜。基本和充足。

void swap(char **s1, char **s2){ 
char *temp=*s1; 
*s1=*s2; 
*s2=temp; 
} 

int main(){ 
char *s1="second"; 
char *s2="first"; 
swap(&s1,&s2); 
printf("%s",s1); 
printf("%s",s2); 
return 0; 

} 

希望這會有所幫助。