将struct内部的2D数组传递给另一个struct

时间:2014-12-11 14:07:31

标签: c++ arrays pointers struct

我试图用C / C ++编写一个棘手的东西。我在结构中有一个2D数组指针,我想将2D数组的第i个(在第3个示例中)行的地址作为指向另一个结构的指针传递。

以下是代码:

的main.cpp

#include <iostream>
#include <cstdlib>

using namespace std;

typedef struct
{
    unsigned int t1[5][10];
} TEST1;

typedef struct
{
    unsigned int * t2;
}TEST2;

TEST1 a;
TEST2 b;


unsigned int test2(unsigned int * data)
{
    int i,j,k;
    k=0;
    for(i=0;i<5;i++)
    {
        for(j=0;j<10;j++)
        {
            a.t1[i][j]=k;
            cout << a.t1[i][j] << " ";
            k++;
        }
        cout << endl;
    }

    data = &(a.t1[3][0]);
    cout << *data << endl;

    return 10;
}

void test()
{
    unsigned int size,i;

    size = test2(b.t2);

    cout << (b.t2) << endl;

}

int main()
{
    test();
    return 0;
}

代码的输出是:

0 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 17 18 19 
20 21 22 23 24 25 26 27 28 29 
30 31 32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 48 49 
30
0

为什么要打印&#34;数据&#34;里面给了我正确的答案和印刷&#34; b.t2&#34;给我0?似乎&#34;数据&#34;没有作为参考传递给&#34; b.t2&#34;

4 个答案:

答案 0 :(得分:1)

您只是将b.t2的值传递给test2b.t2本身的值不会更改。当您致电cout << (b.t2) << endl;

时,它仍为NULL

答案 1 :(得分:1)

因为你甚至不打印相同的东西。在函数中,您打印数据指向的整数:*data,并在函数外部打印指针b.t2的值

如果希望指针在函数外部改变,则传递指针的地址:

unsigned int test2(unsigned int** data)
{
    ...
   *data = &(a.t1[3][0]);

如果您现在打印b.t2的值,它将不再为NULL。

size = test2(&b.t2);

cout << (b.t2) << endl;

答案 2 :(得分:1)

data因为它是一个单独的指针,您要传递一些非正数值b.t2

因此数据的变化不会反映在b.t2中。否则,您应该将数据作为双指针来保存单个指针b.t2的地址,并通过引用传递此值,以确保对数据的更改也会导致对b.t2的更改。

b.t2 = test2();

unsigned int *test2()
{
// GO ahead and make `data` point to some valid memory location and return that location
}

C代码:

struct node
{
    int *p;
};

int *test2()
{
    int *t = malloc(sizeof(int));
    *t =10;
    return t;
}
int main(void) {
    struct node n;
    n.p = test2();
    printf("%d",*(n.p));
    return 0;
}

答案 3 :(得分:0)

在您的代码中,test2()函数内部

data = &(a.t1[3][0]);

您正在尝试更改数据所持有的地址,并期望在test()中反映该更改。你不能这样做。您可以更改data所占地址的值,而不是datatest2()本身的值。

test() data中,data仍未被初始化。

请记住,c使用按值传递。 data本身已通过值传递。

如果您必须更改data本身,则需要将指针test2()传递给*data

注意,*(b.t2)相当于{{1}}