2016-05-17 17 views
-3

2つの整数の間のスワップを求められます。Cでのスワップの問題[初心者]

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

void swaplol(int a, int b) 
{ 
    int tmp; 
    tmp = a; 
    a = b; 
    b = tmp; 

    printf("After the swap : a= %d, b=%d\n",a,b); 

} 

問題がどこにあるかはわかりません。あなたは価値があるときになるように、スワップ機能に整数のアドレスを渡す必要が

void swaplol(int * a, int * b) 
    { 
     int tmp; 
     tmp = *a; 
     *a = *b; 
     *b = tmp; 
    } 

    int main(void) 
    { 
     int a, b; 
     a = 666; 
     b = 998; 

     printf("Before the swap a = %d, b = %d\n", a ,b); 
     swaplol(&a, &b); 
     printf("After the swap : a= %d, b=%d\n", a, b); 

     return 0; 
    } 
+0

パラメータはCで*値*によって渡されます。関数内で任意の値を使用できますが、戻っても変更は登録されません。 –

+0

この問題について多くのご質問があります – Michi

答えて

0

使用ポインターを...良いsynthaxが賢明なようですスワップすると、aとbの値がメインに戻されます。したがって、intの代わりにポインタを受け入れるようにswaplol関数を変更する必要があります。

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

void swaplol(int *a, int *b) 
{ 
    int tmp; 
    tmp = *a; 
    *a = *b; 
    *b = tmp; 

    printf("After the swap : a= %d, b=%d\n",*a,*b); 

} 

int main(void) { 
    // your code goes here 
    int a,b; 
    a = 666; 
    b = 998; 

    printf("Before the swap a = %d, b = %d\n",a,b); 

    swaplol(&a,&b); 
    printf("After the swap : a= %d, b=%d\n",a,b); 
    return 0; 
} 
+5

ちょっと説明してください。私は呼び出しコードも追加すると思います。 –

+0

メイン機能を更新 –

2

:すべては

int main(void) 
{ 
    int a,b; 
    a = 666; 
    b = 998; 

    printf("Before the swap a = %d, b = %d\n",a,b); 

    swaplol(a,b); 

    return 0; 
} 

おかげ

+0

このコードはすぐにUBを呼び出しています... Upvote?真剣に? –

+0

@ EugeneSh.What UB? – HoKy22

+0

'main'の' a、b'はポインタです。 –

1

swap関数は、mainで宣言された元の変数の値を入れ替える必要があります。

これを行うには、関数が参照によって変数を受け入れる必要があります。

そして、元の変数が交換されたことを示すために、関数から出力ステートメントを削除し、mainに配置する必要があります。例

#include <stdio.h> 

void swaplol(int *a, int *b) 
{ 
    int tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

int main(void) 
{ 
    int a, b; 
    a = 666; 
    b = 998; 

    printf("Before the swap a = %d, b = %d\n", a, b); 

    swaplol(&a, &b); 

    printf("After the swap : a = %d, b = %d\n", a, b); 

    return 0; 
} 

については

ヘッダ<stdlib.h>

0

を含める必要はありませんちょうど私が一時変数を使用せずにコードスニペットを提供しています。..ポインタを追加します。 C

int main() 
{ 
    .... 
    .... 
    swaplol(&a,&b); 
} 
int swaplol(int *a,int *b) 
{ 
    *a=*a+*b; 
    *b=*a-*b; 
    *a=*a-*b; 
    printf("a=%d,b=%d",a,b); 
} 
+0

'int'ではなく' void'を意味します – Michi

+0

はいswaplolは無効になります。 –

0

ポインターの助けを借りて、アドレスによる値とコールによって呼び出しがあります。そこでは、他の言語に存在する参照による呼び出しを「シミュレート」することができます。

デフォルトでは、Cはいずれも引数を渡すのにcall(pass) by valueを使用します。つまり、関数内のコードは関数を呼び出すために使用される引数を変更できません。出力は5なります

#include <stdio.h> 

void foo(int x); 


int main(void){ 
    int x = 5; 

    foo(x); 

    printf("X = %d\n", x); 
} 

void foo(int x){ 
    x = 10; 
} 

は、次の例を取ることができます。

あなたは設定で良いコンパイラを使用している場合は、警告この種類の表示されますオン:今ちょうど起こった何

program.c:14:15: error: parameter ‘x’ set but not used [-Werror=unused-but-set-parameter] 
void foo(int x){ 
      ^

を? 定義では、値渡し(パス)は、渡された実際のパラメータの値、実際のパラメータの内容のコピーをメモリにコピーしていることを意味します。

あなたは本当にあなたがその変数のアドレスを渡す必要がある値を変更し、それを指すようにポインタを使用する必要がある場合:

#include <stdio.h> 

void foo(int *x); 


int main(void){ 
    int x = 5; 

    foo(&x); 

    printf("X = %d\n", x); 
} 

void foo(int *x){ 
    *x = 10; 
} 

今、出力が10になります。