2

私はこの問題に亀裂を入れようとしています。質問には、*「swap_nums は機能しているようですが、swap_pointers は機能していないようです。修正してください。」* ちなみに私は初心者です :)

私は自分で解決策を見つけることができると信じていますが、問題は、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 を交換すると思われるプログラムです。次に、宣言された 2 つの文字列を取り、それらも交換します。

主な機能:

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 があるのでしょうか? ここで少し混乱しています。誰かが私にこれを少し説明してもらえますか?

4

6 に答える 6

8

C では、ポインターを含め、すべてが値として渡されます。したがって、ポインターを交換するコードはポインターのコピーを操作し、元のポインターは変更されません。

ポインターを交換するには、単にポインターではなく、ポインターをポインターに渡す必要があります。もちろん、関数内では、 で行ったのと同じ方法で逆参照のレベルを追加する必要がありますswap_numbers

void swap_pointers (char **x, char **y) {
    char *temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
于 2013-06-24T03:55:38.507 に答える
0

ヒント: 値による呼び出しと参照による呼び出しを調べて、クエリを明確に理解してください。

于 2013-06-24T06:47:12.510 に答える
0

ポインタはアドレスかもしれませんが、値によって関数に渡されます (C のすべてのように)。2 つのポインターを交換するには、ポインターへのポインターが必要です


これがあなたが望むものです:

#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;
}
于 2013-06-24T03:54:03.330 に答える
0

ここにヒントがあります。これには何か問題があります。

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

のタイプとは何s1ですか?「2 番目に印刷する必要があります」とは何ですか? また、文字列リテラルを変数に保存するにはどうすればよいでしょうか?

于 2013-06-24T03:54:41.227 に答える