C 我如何编写一个函数来为要复制的已定义数量的项复制一个项数组

C 我如何编写一个函数来为要复制的已定义数量的项复制一个项数组,c,pointers,C,Pointers,我试图学习如何使用指针,并希望编写一个函数,其中我有两个整数数组,并希望复制一个整数数组,以复制特定数量(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<nb

我试图学习如何使用指针,并希望编写一个函数,其中我有两个整数数组,并希望复制一个整数数组,以复制特定数量(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;
}

关键是:如果传递给函数,数组会自动衰减为指向其第一个元素的指针。所以你只需要像这样调用你的函数

int_copy(A, B, 3);
获取数组的地址是可能的,因为数组和它们的第一个元素总是共享相同的地址,所以将产生相同的数值。但指针的类型不同,它不是指向int的指针,而是指向长度为4的int数组的指针:

int(*pointer)[4] = &A;
语法很难看,我知道

我想为数组A输出6,7,8,4

假设这就是为什么您首先备份了
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]);
}
int main(无效)
{
内部副本(A&B,3);
对于(尺寸i=0;i

最后:您不需要在void函数中显式地
返回
(仅当您想提前退出时…。

代码中有一些问题:

  • 在调用函数之前,您应该定义或至少声明函数
    int\u copy

  • 您应该将指向数组内容的指针传递到
    int\u copy
    ,这是通过将指针传递到数组的第一个元素来完成的:
    int\u copy(&A[0],&B[0],3)可简化为
    内部副本(A、B、3)

  • int\u copy
    中,可以增加循环中的两个指针,这很好,但不应尝试访问它们在循环末尾指向的元素,因为该点刚刚超过数组的末尾,因此读取这些值具有未定义的行为

以下是更正的版本:

inta[]={1,2,3,4};
int B[]={6,7,8,9};
无效内部副本(内部*ptrA、内部*ptrB、内部nbr){
对于(int i=0;i
try:
int\u copy(&A[0],&B[0],3)
内部副本(A、B、3)
是的,
A
是指向int的指针,
&A
是指向4个int数组的指针。@LeeDanielCrocker实际上,
A
是一个4个int数组;当在需要指针的上下文中使用时,它会衰减为指针…RE是最后一个要点:在这种情况下,OP通过
nbr=3
,数组长度为
4
,因此
printf
语句是可以的。在void print for const int*p/中,当您在main中调用int print并且在const int*p的位置有a时,p现在指向数组AI进行了更改,它起作用了,但是我有点困惑于“isizeof(whatever)
给出所讨论对象的大小,不管它是什么(结构、数组、指针等等),以字节为单位,但您需要得到元素的数量。因此,对于数组,将总大小(以字节为单位)除以单个元素的字节数。在您的具体案例中,假设
int
有四个字节(不一定是这样!):
sizeof(A)
是16,
sizeof(*A)
A
的第一个元素i的大小。E一个
int
,即。E4,所以最终结果是
16/4==4
。有些人更喜欢变量
sizeof(A)/sizeof(A[0])
,但这是等效的……在(size_t i=0;iA
&A
生成一个指针(请再次查看我的答案以了解确切的类型…),因此您可以得到指针的大小(就像您得到
sizeof(void*)
),这显然是系统上的八个字节(同样,这可能不同…)。并且可能与原始阵列的大小相差很远。。。
int main(void)
{
    int_copy(&A, &B, 3);
    for(size_t i = 0; i < sizeof(A)/sizeof(*A); ++i)
        printf("%d ", A[i]);
}