使用指针连接两个数组(提供 C 代码)

标签 c arrays pointers concatenation

我目前正在研究指针,为了进一步理解我正在尝试使用指针将两个数值数组连接成一个。 代码如下所示。

#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/

相关文章:

c++ - 用零填充字符串后 - 它打印未指定的字符? (C++)

swift - 在 Swift 类中使用指向对象的指针

c - C 中 & 运算符的奇怪行为

我们可以在结构定义之前在文件范围内声明结构对象吗?

c - 如何在C中使用getchar读取单个字符?

php - Laravel 如何自动获取数组 id

c - 在 C 中测试 linux CAP_FOWNER 功能?

c++ - 如何使 GDB 更快

java - 如何在java中每次迭代添加两个数组,然后保存数组的内容

c++ - 为什么要在 C++ 中将智能指针作为函数参数传递?