1

以下で読んだことを行う関数を作成する必要がありますが、ポインターを使用します(したがって、「i」と演算子 [] を削除する必要があります)...したがって、最初の宣言は次のよう void match (int *a, int *a, int n)になりますが、どうすれば「i」を使用せずにインクリメントしますか? ありがとうございました :)

void match (int a[], int b[], int n) {
int i;
for (i = 0; i < n; i++)
a[i] = b[i];
}
4

7 に答える 7

6

これは、C では「代入」と呼ばれます。

memcpy()これは、メモリ ブロックをコピーする標準的な方法です。

memcpy(a, b, n * sizeof *a);

それができない場合は、もちろんポインター演算を使用するか、ポインターを取り込んで関数自体で配列表記を使用できます。

void assign(int *a, const int *b, int n)
{
  int i;

  for(i = 0; i < n; ++i)
    a[i] = b[i];
}

読み取り専用パラメーターであることを示すために、ソース ポインターbが としてマークされていることに注意してください。const

ポインター演算では、次のようになります。

void assign(int *a, const int *b, int n)
{
  const int *end = b + n;
  while(b < end)
   *a++ = *b++;
}
于 2013-01-09T14:50:48.653 に答える
3

どうぞ:

while (n > 0) {
    n--;
    *a++ = *b++;
}
于 2013-01-09T14:51:52.877 に答える
1
void match (int *a, int *b, int n) {
    int *c;
    c = a;
    while ((a-c)<n) {
        *a=*b;
        a++; b++;
    }
}

copy関数名をではなく に変更することをお勧めしますmatch。なぜならmatch、配列を比較したいという意味です

于 2013-01-09T14:51:16.777 に答える
0

ポインター演算:

int* pa = NULL;
for (pa = a; pa != a + n; pa++)
{
  *pa;
}

上記のループはpa、a の各メンバーを順番にポイントし、逆参照します。

覚えておくのにも役立ちますa[i] = *(a+i)

于 2013-01-09T14:50:56.557 に答える
0

Cでmemcpyを実装する最も一般的で(私の経験では)最も効果的な方法は次のとおりです。

void my_memcpy (void* s1, const void* s2, size_t n)
{
  uint8_t*       u_s1 = s1;
  const uint8_t* u_s2 = s2;

  while(n != 0)
  {
    *u_s1 = *u_s2;

    u_s1++;
    u_s2++;  
    n--;
  }
}

n が int ではなく size_t 型の場合、n != 0使用できないか、コードがクラッシュして書き込みます。n > 0

于 2013-01-09T15:17:12.227 に答える
0

ポインター自体をインクリメントできます。

void copy(int *a, int *b, size_t sz)
{
    int *p = a;
    while (p - a < sz) {
        *p++ = *b++;
    }
}
于 2013-01-09T14:52:02.177 に答える
0

ポインターをインクリメントできます。これは C ポインター演算の一部です。iが配列の要素へのポインタ++iであり、が配列の次の要素へのポインタであるとします。コンパイラは、ポイントされた要素のサイズを (ポインターの型を見て) 自動的に検出し、ポインターを正しいオフセットだけ増やします。

于 2013-01-09T14:52:43.697 に答える