我目前正在讨论指针并进一步理解我试图使用指针将两个数值数组连接成一个。 代码如下所示。
#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]=%d\n",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.
所以它似乎适用于函数中的第一个操作,但是第二个操作并不完全有效。我会认为这会起作用。我对这个简单的任务感到有些困惑。
我今天早些时候使用指针和for循环完成了连接并且它有效,但我想我会尝试使用这个方法使用引用和双指针调用。
非常感谢任何帮助,谢谢。
答案 0 :(得分:2)
程序有不确定的行为。
在此声明之后的函数concat
内
pc[0]=*pb;
原始指针p_c
开始指向数组array_b
的第一个元素。
实际上这句话
pc[0]=*pb;
如果在main中你写,具有相同的效果
p_c = array_b;
因此指针p_c
现在不指向数组array_c
。
该函数中的语句
pc[3]=*pa;
导致程序的未定义行为。因为指针pc
没有指向数组。它指向main中声明的单个对象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
,而是可以使用显式循环来复制数组的元素。
答案 1 :(得分:1)
似乎有一些关于int的数组,int的指针,指向int的指针的指针,以及带有数组订阅的单个赋值的基本误解。
首先,类型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]=%d\n",i,array_c[i]);
}
return 0;
}