我正在尝试学习如何使用指针,并想编写一个函数,其中我有两个整数数组,并想复制一个整数数组以复制特定数量 (nbr) 的整数。
int A[]= {1,2,3,4};
int B[] = {6,7,8,9};
int main(void)
{
int_copy(&A, &B, 3);
}
void int_copy(int *ptrA, int *ptrB, int nbr)
{
int * p = ptrA;
for (int i = 0; i<nbr; i++)
{
*ptrA++ = *ptrB++;
}
printf("%d\n", *ptrA);
printf("%d\n", *ptrB);
return;
}
我想为数组 A 输出 6,7,8,4,但我收到以下错误消息:
intcopy.c:10:14: warning: incompatible pointer types passing 'int (*)[4]' to parameter of type 'int *' [-Wincompatible-pointer-types]
int_copy(&A, &B, 3);
^~
intcopy.c:6:20: note: passing argument to parameter 'ptrA' here
void int_copy(int *ptrA, int *ptrB, int nbr);
^
intcopy.c:10:18: warning: incompatible pointer types passing 'int (*)[4]' to parameter of type 'int *' [-Wincompatible-pointer-types]
int_copy(&A, &B, 3);
^~
intcopy.c:6:31: note: passing argument to parameter 'ptrB' here
void int_copy(int *ptrA, int *ptrB, int nbr);
^
最佳答案
要点是:如果传递给函数,数组会自动衰减为指向其第一个元素的指针。所以你只需像这样调用你的函数
int_copy(A, B, 3);
获取数组的地址是可能的,并且由于数组和它们的第一个元素总是共享相同的地址,将产生相同的数值。但是指针的类型不同,它不是指向 int 的指针,而是指向长度为 4 的 int 数组的指针:
int(*pointer)[4] = &A;
语法很丑,我知道...
I want to output 6,7,8,4 for array A
假设这就是您首先备份 ptrA
的原因?只是,您不使用它...
printf("%d\n", *ptrA);
printf("%d\n", *ptrB);
这两个语句将分别打印一个整数,即两个指针指向的整数。当您在循环中将它们都推进 3 时,它们将打印出来
4
和 9
。
您需要使用备用指针 p
并在另一个循环中迭代恰好四个元素。唯一的:你的复制函数不知道有多少数组元素。在某些限制条件下,以这种方式打印可能是可行的,但它是危险的代码。想象一下,如果您将指针传递到数组中间的某个位置(-> 由于读取超出数组边界而导致的未定义行为!)会发生什么。
安全的方法是不在被调用的函数中打印,而是:
int main(void)
{
int_copy(&A, &B, 3);
for(size_t i = 0; i < sizeof(A)/sizeof(*A); ++i)
printf("%d ", A[i]);
}
最后:您不需要在 void 函数中显式return
(仅当您想提前退出时...)。
关于c - 我如何编写一个函数来复制一个项目数组,用于复制一些定义数量的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56673604/