gpt4 book ai didi

c - 我如何编写一个函数来复制一个项目数组,用于复制一些定义数量的项目

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:48 25 4
gpt4 key购买 nike

我正在尝试学习如何使用指针,并想编写一个函数,其中我有两个整数数组,并想复制一个整数数组以复制特定数量 (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 时,它们将打印出来49

您需要使用备用指针 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com