我目前正在研究指针,为了进一步理解我正在尝试使用指针将两个数值数组连接成一个。 代码如下所示。
#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 循环完成了串联,并且它有效,但我想我会尝试使用引用调用和双指针来使用此方法。
任何帮助将不胜感激,谢谢。
最佳答案
程序有未定义的行为。
在该语句之后的函数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
。
关于使用指针连接两个数组(提供 C 代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44768659/