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

您可以增加指针本身:

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 回答
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--;
  }
}

Please note that n != 0 is absolutely essential, you cannot use n > 0 or the code will crash and burn when n is of type size_t, rather than int.

于 2013-01-09T15:17:12.227 回答