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