我目前正在浏览指针,为了进一步了解我,我试图将两个数值阵列串联成一个指针。代码可以在下面看到。
#include <stdio.h>
void concat(int **pa,int **pb,int **pc)
{
pc[0]=*pb;
pc[3]=*pa;
}
int main()
{ int i, array_a[3]={2,4,6},array_b[3]={1,3,5},array_c[6];
int *p_a=array_a;
int *p_b=array_b;
int *p_c=array_c;
concat(&p_a,&p_b,&p_c);
for(i=0;i<6;i++)
{
printf("array_c[%d]=%dn",i,p_c[i]);
}
return 0;
}
这是输出。
array_c[0]=1
array_c[1]=3
array_c[2]=5
array_c[3]=0
array_c[4]=2
array_c[5]=4
Press any key to continue.
因此,它似乎可以在功能中的第一个操作中使用,但是第二个操作无法完全使用。我会认为这会起作用。我对这个简单的任务有点困惑。
我今天早些时候使用了指针和循环进行了串联,但我想我会尝试使用该方法使用该方法使用参考和双指指针。
任何帮助将不胜感激,谢谢。
该程序的行为不确定。
此语句之后的功能concat
pc[0]=*pb;
原始指针p_c
开始指向数组array_b
的第一个元素。
实际上这个语句
pc[0]=*pb;
如果您写
,则具有相同的效果p_c = array_b;
所以指针p_c
现在不指向数组array_c
。
函数中的此语句
pc[3]=*pa;
导致程序的不确定行为。因为指针pc
没有指向数组。它指向主声明的单个对象p_c
。
无需将指针传递给指针,因为指针本身在功能内没有更改。
您需要的是,使用循环或标准函数memcpy
。
例如
#include <stdio.h>
#include <string.h>
int * concat( int *a, const int *a1, size_t n1, const int *a2, size_t n2 )
{
memcpy( a, a1, n1 * sizeof( int ) );
memcpy( a + n1, a2, n2 * sizeof( int ) );
return a + n1 + n2;
}
#define N1 3
#define N2 3
#define N3 N1 + N2
int main(void)
{
int array_a[N1] = { 2, 4, 6};
int array_b[N2] = { 1, 3, 5};
int array_c[N3];
int *p_a = array_a;
int *p_b = array_b;
int *p_c = array_c;
int *result = concat( p_c, p_b, N2, p_a, N1 );
for( const int *p = p_c; p != result; ++p )
{
printf( "%d ", *p );
}
putchar( 'n' );
return 0;
}
程序输出是
1 3 5 2 4 6
或而不是调用函数memcpy
,您可以使用明确的循环复制数组的元素。
看来,似乎有一些基本的误解是关于ints的数组,ints的指针以及一方面指示的指针,以及一方面的指示,以及单个具有数组订阅的单个分配意味着。
首先,类型int **p
表示指向整数指针的指针,因此pc[3]=pc[0]
(与pc[3]=*pc
相同(实际上复制了指针值,而不是INT值;这可能会调用不确定的行为,因为实际内容是一个积分值,但预期的是指针值。参数应为int *
类型或int []
。
第二,像 pc[3]=pb[0]
这样的单个分配仅复制一个元素,而不是一系列元素。改用循环,然后传递要复制为附加参数的元素的数量:
void concat(const int pa[],const int pb[], int pc[], size_t numElems)
{
for (size_t i=0; i<numElems; i++) {
pc[i]=pb[i];
pc[i+numElems]=pa[i];
}
}
int main()
{ int i;
const int array_a[3]={2,4,6}, array_b[3]={1,3,5};
int array_c[6];
concat(array_a,array_b,array_c,3);
for(i=0;i<6;i++) {
printf("array_c[%d]=%dn",i,array_c[i]);
}
return 0;
}