将指针结构的信息转换为数组

时间:2016-01-23 19:36:07

标签: c arrays pointers matrix struct

我有一个for循环的问题,它应该将指针结构的信息放到数组中。此结构适用于复数。问题是数字m [n] .re / .im-他们不是korrekt。

typedef struct
{
  float re, im;
} Complex;

#define N 2
#define M 2

int main()
{
Complex* p;
Complex matrix[N][M]; //already filled
Complex m[N*M];
int n;

n = 0;
p = NULL;

for(p = &matrix[0][0]; p<= &matrix[0][0]+N*M-1; p++)
    {
        m[n] = *p;
        n = n+1;
    }
}

4 个答案:

答案 0 :(得分:1)

您可以使用标头memcpy中声明的标准C函数<string.h>,例如

memcpy( m, matrix, N * M * sizeof( Complex ) ); 

如果你想使用一个使用指针的循环,那么它可以通过以下方式查找

for ( Complex *q = ( Complex * )matrix, *p = m; q != ( Complex * )matrix + N * M; p++, q++ )
{
    *p = *q;
}

答案 1 :(得分:1)

我修改了你的程序来初始化矩阵数组,并使用for循环打印到stdout中的矩阵和数组m的值:

#include <stdio.h>

typedef struct
{
  float re, im;
} Complex;

#define N 2
#define M 2

int main()
{
    Complex* p;
    Complex matrix[N][M]; //already filled
    Complex m[N*M];
    int idx, jdx, val = 1;
    for (idx = 0; idx < N; idx++) {
            for (jdx = 0; jdx < M; jdx++) {
                    matrix[idx][jdx].re = val;
                    matrix[idx][jdx].im = val;
                    ++val;
            }
    }
    int n;

    n = 0;
    p = NULL;

    for (p = &matrix[0][0]; p < &matrix[0][0] + N*M; p++)
    {
            printf("matrix[%d] = %f + %fi\n", n, p->re, p->im);
            m[n] = *p;
            n = n+1;
    }

    int midx = 0;
    for (midx = 0; midx < N*M; midx++) {
            printf("m[%d] = %f + %fi\n", midx, m[midx].re, m[midx].im);
    }
    return 0;

}

我不确定发生了什么,但对我而言,看起来你没有初始化数组。记住,memcpy是你的朋友。希望这段代码有所帮助。

答案 2 :(得分:0)

我认为指针TwitterTemplate包含p的地址。不确定,但尝试这样一次

struct Complex

答案 3 :(得分:0)

执行复制的最快方法是使用memcpy,但如果要使用循环,则代码应如下所示

Complex matrix[N][M];
Complex array[N*M];

Complex *p = array;
for ( int n = 0; n < N; n++ )
    for ( int m = 0; m < M; m++ )
        *p++ = matrix[n][m];

在回应注释时,只给出指向矩阵的指针,并知道尺寸,就可以创建一个像二维数组一样的指针。

void someFunction( Complex *matrix, int sizeN, int sizeM )
{
    Complex (*p)[sizeM] = (void *)matrix;

    for ( int n = 0; n < sizeN; n++ )
        for ( int m = 0; m < sizeM; m++ )
            printf( "%f %f\n", p[n][m].re, p[n][m].im );
}