使用指针(提供的C代码)加和两个阵列



我目前正在浏览指针,为了进一步了解我,我试图将两个数值阵列串联成一个指针。代码可以在下面看到。

#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;
}

最新更新