我试图用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;
答案 0 :(得分:1)
您只是将b.t2
的值传递给test2
。 b.t2
本身的值不会更改。当您致电cout << (b.t2) << endl;
答案 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
所占地址的值,而不是data
中test2()
本身的值。
在test()
data
中,data
仍未被初始化。
请记住,c使用按值传递。 data
本身已通过值传递。
如果您必须更改data
本身,则需要将指针test2()
传递给*data
。
注意,*(b.t2)
相当于{{1}}