2014-12-11 2 views
0

Я пытаюсь закодировать сложную вещь в C/C++. У меня есть указатель 2D-массива внутри структуры, и я хотел бы передать адрес i-го (в примере ниже 3-й) строки 2D-массива в качестве указателя на другую структуру.Передача 2D-массива внутри структуры в другую структуру

Вот код:

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 

Почему печать "данные" внутри дает мне правильный ответ и печать «b.t2» дает мне 0? Похоже, что «данные» не передаются в качестве ссылки на «b.t2»

+0

Вместо этого данные = & (a.t1 [3] [0]); вы можете использовать как * data = (a.t1 [3] [0]); означает, что вы получите правильный результат. –

+0

Если 'data' изменяется как отдельный экземпляр, как вы ожидаете' b.t2', который не указывает на какое-либо допустимое местоположение для хранения этого измененного значения? – Gopi

+0

Круто, ребята, я понял это. Спасибо за ответы. На самом деле я должен сделать test2() вернуть адрес, верно? –

ответ

0

В коде внутри test2() функций

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

вы пытаетесь изменить адрес проводятся по данные и ожидаем, что это изменение изменится на test(). Вы не можете сделать это. Вы можете изменить значение по адресу data, а не data от test2().

В test(), data все еще будет неэнализован.

Помните, что c использует значение pass-by-value. data сам передан по значению.

Если вам нужно изменить data, то вам необходимо передать указатель на data на номер test2().

Как примечание, *data эквивалентно *(b.t2)

+0

Почему нисходящие (ые) точки (-ы)? любезно оставить комментарий тоже. –

+0

Я не спустил вниз, на самом деле это был хороший ответ. :) Спасибо за ответ. Тогда на самом деле я должен сделать test2() вернуть адрес и взять его в test(), так? –

+0

@DiegoTsutsumi совершенно. это лучший подход. –

1

Вы только передавая значение b.t2 в test2. Значение b.t2 себя не будет изменение. По-прежнему NULL, когда вы звоните cout << (b.t2) << endl;

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; 
1

data как это отдельный указатель на который вы передаете некоторое unintialized значение, которое 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 
} 

С-код для этого:

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; 
} 
Смежные вопросы