我必须编写一个函数来执行您在下面阅读的内容,但是使用指针(所以我必须删除“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];
}
这在 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++;
}
干得好:
while (n > 0) {
n--;
*a++ = *b++;
}
void match (int *a, int *b, int n) {
int *c;
c = a;
while ((a-c)<n) {
*a=*b;
a++; b++;
}
}
我建议将您的函数名称更改为copy
而不是match
. 因为match
意味着您要比较数组
指针运算:
int* pa = NULL;
for (pa = a; pa != a + n; pa++)
{
*pa;
}
上面的循环pa
依次指向 a 的每个成员,并取消引用它。
这也有助于记住a[i] = *(a+i)
您可以增加指针本身:
void copy(int *a, int *b, size_t sz)
{
int *p = a;
while (p - a < sz) {
*p++ = *b++;
}
}
您可以增加一个指针,它是 C 指针算法的一部分。假设i
是一个指向数组元素的++i
指针,是指向数组下一个元素的指针。编译器自动找到指向元素的大小(查看指针的类型)并将指针增加正确的偏移量。
在 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.