0

関数がその内容を編集できる関数に配列をどのように渡しますか?

するときのように

function(int *x)
 {*x = 10;}

main()
  {int x;
   function(&x);}

文字配列を使用して同じことを行うにはどうすればよいですか?

私がするときはいつでも

   function(char *array[], int *num)
   { int x = *num;
     *array[x] = 'A'; }

   main()
   { char this[5] = "00000"; //not a string
     int x = 3;
     function(&this, &x); }

DEVC++は言う

[Warning] passing arg 1 of `function' from incompatible pointer type 

明らかに私は何か間違ったことをしたので、それを修正する方法を教えてください。ありがとう

4

6 に答える 6

1

あなたは書くべきです:

void function(char array[], int *num)
{
   int x = *num;
   array[x] = 'A';
}

void main()
{
   char my_array[5] = "00000";
   int x = 3;
   function(my_array, &x);
}

表記char *array[]は、ここでは必要のないポインタの配列です。

配列をどこかに渡すときは、そのアドレスを取得しないでください。配列はデフォルトでポインタに調整されます。

編集:

関数プロトタイプ:

void function(char array[], int *num);
void function(char *array, int *num);

完全に同一です。それらの間に小さな違いさえありません。

于 2012-08-11T05:29:21.313 に答える
1

配列はアドレスでのみ渡すことができるため、ここではchar *配列は必要なく、char配列だけが必要です。

rettype function(char *array, int *num)
{
    array[*num] = 'A';
}

int main()
{
    char arr[] = "1234567890";
    int i = 2;
    function(arr, &i);
}
于 2012-08-11T05:31:08.380 に答える
0

まずthis、変数名として使用しないでください。そのC++キーワードです。申し訳ありませんが、それがCの質問であることに気づいていませんでした。

main()
{ 
  char foo[5] = "00000"; //not a string
  int x = 3;
  function(foo, &x); 
}

のメモリアドレスは使用しないでfooください。fooポインタを受け入れるコンテキストで使用すると、最初の要素へのポインタになります。*fooと同じfoo[0]です*(foo + 0)

ここに画像の説明を入力してください

同様に、はとfoo[3]同じです*(foo + 3)(コンパイラが要素サイズの乗算を処理します)。

于 2012-08-11T05:29:31.657 に答える
0

さて、最初に覚えておくべきことは、「配列への」ポインタのようなものはないということですが、それはかなり頻繁に言われます。ずさんです。

(以下で指摘するように、「配列へのポインタ」という用語は厳密には意味がありますが、混乱していると思います。実際には、すべてのポインタにアドレスが含まれています。宣言によっては、コンパイラは、コンテキストで正しく使用されているかどうかを識別できます。これは、エラーメッセージが実際に示していることです。関数で宣言したのは、charの配列へのポインタです。つまり、char **ではなく、と同じことです。 char *、これが渡されます。ただし、、、、、char *またはchar **char ******重要な点は、複雑になりすぎていることです。必要なアドレスは、配列名で識別されています。)

ポインタはポインタであり、アドレスです。

Cの配列は、単に割り当てられたメモリのチャンクであり、その名前は最初の要素のアドレスを表します。それで

char a[42];

は42文字の長さのメモリのブロックであり、aはそのアドレスです。

2番目の関数を次のように書き直すことができます

void foo(char* a, int num){ // (3)
     // notice that you don't need the word function and 
     // for lots of reasons I wouldn't use it  as a function name.
     a[num] = 'A'; // (4)
}

int main(){
      // Sadly "00000" IS a string no matter what your comment
      // says.  Use an array initializer instead.

      char arry[5] = {'0','0','0','0','0' } ; // (1)
      foo(arry,3); // (2)
}

これは、あなたのコードが意味すると私が信じていることを実行します。ご了承ください

(1)「00000」は実際には文字列であるため、実際には、配列初期化子で初期化できた6要素の長さの配列を作成しています。

{'0','0','0','0','0', 0 }

(2)配列(「this」はCのような言語のキーワードであることが多いので、「this」の代わりに「arry」と名付けました。なぜ混乱のリスクがありますか?)はすでにアドレスです(ただし、ポインターではありません。ポインタへの割り当ての右側ですが、左側にはありません。)

だから私が電話するとき

foo(arry,3);

arryの最初の要素のアドレスと番号3で呼び出しfooています(そのための変数を宣言する必要はありません)。

今、私はそれを次のように書くこともできたでしょう

foo(&arry[0],3);

「の0番目の要素を見つけて、arryそのアドレスを取得する」と読みます。これは、CのIDであり、任意の配列に対応します。

char c[len];

c&c[0]同じアドレスを参照します。

(3)これは。として定義することもできますfoo(char arry[], int num)。それらは同等です。

(4)参照するときは、配列の先頭のアドレスにある、が指すメモリの-番目の要素a[num]を直接参照しています。すべての間接参照は必要ありません。numaarry

これを理解するのが少し難しいことを気にしないでください。Cを開始するときは誰にとっても難しいことです。

于 2012-08-11T05:29:33.897 に答える
0

Cでは、配列名は配列の先頭へのポインターに「展開」します。「&array」を渡すと、配列の先頭へのポインターへのポインターが渡されるため、警告が表示されます。

char array[512];

myfunc(array, foo);

あなたがやりたいことをするための適切な方法です。

于 2012-08-11T05:30:17.460 に答える
0

実際には、1つの次元配列を取得しました。したがって、2つの方法で関数を定義できます...

(私)

 function(char array[], int *num)
       { int x = *num;
         *array[x] = 'A'; }

       main()
       { char this[5] = "00000"; //not a string
         int x = 3;
         function(this, &x); }

(ii)

function(char *array, int *num)
       { int x = *num;
         *array[x] = 'A'; }

       main()
       { char this[5] = "00000"; //not a string
         int x = 3;
         function(this, &x); }

しかし、関数定義で*array[]は、配列が2次元配列であることを意味する引数として記述しました。したがって、配列を2次元配列として宣言する必要があります。

function(char *array[], int *num)
       { int x = *num;
        //implement your code }

       main()
       { char this[5][10];
         // you can initialize this array.
         int x = 3;
         function(this, &x); }

お役に立てればと思います。

于 2012-08-11T05:49:32.500 に答える