2015-04-01 4 views
0

Pascal:C язык. Указатель на массив и массив

type 
    TA = packed record 
     b: Char;  
     c: LongInt; 
    end; 
    TAA = array[1..255] of TA; 
var 
    D: LongInt; 
    Z: LongInt; 
    N: array[0..10] of packed record 
     F: LongInt;  
     Y: LongInt;   
     WL, WW: Word; 
     E: ^TAA;   
    end;  
var 
b_var:char; 
i,j:longint; 
... 
     b_var := N[i].E^[j].b; 

язык C:

typedef struct 
{ 
    char b;   
    signed long int c; 
} TA; 
typedef TA TAA[256]; 
signed long int D; 
signed long int Z; 
struct 
{ 
    signed long int F;  
    signed long int Y;   
    unsigned int WL, WW; 
    TAA *E;     
} N[11]; 
... 
//  b_var = N[i].*E[j].b; /*is not allowed by compiler*/ 
//  b_var = N[i].(*E)[j].b; /*is not allowed by compiler*/ 
//  b_var = N[i].E[j]->b; /*allowed by compiler, but no one knows is it same as Pascal */ 

Этот код не работает. Работы b_var = N [i] .E [j] -> b; , но он такой же, как и код Паскаля? E [j] интерпретируется как элемент массива или как элемент указателя?

+0

Где 'typedef'? для 'TOutArr'? Что это такое? –

ответ

0

Правильное ли понимание указателя на массиве https://img-fotki.yandex.ru/get/53/240791000.0/0_17daa3_f02a9eaf_orig.png? Если это правильно, то b_var = N [i]. * E [j] .b; и b_var = N [i] .E [j] -> b; не такой же . Итак, что мне делать, чтобы сохранить логику Паскаля? -

[] имеет более высокий приоритет, чем разыменование. Поэтому я должен использовать b_var = N [i]. (* E) [j] .b ;. Но в данном случае я получил ошибку синтаксиса ошибки: '(' -

Или, может быть, я должен использовать b_var = N [я] .E [0] [J] .b;

0

В C массивы и указатели практически одинаковы. Из-за этого E[j] является синтаксическим сахаром до *(E + sizeof(TOutArr)*j), вам нужно это понять. var->b является синтаксическим сахаром до (*var).b при работе с указателями на структуры.

В этой строке:

N[i].E[j]->b 

N[i] обращается элемент массива N с индексом I (который является структурой)

E[j] получает доступ к элементу массива Е с индексом J (который представляет собой указатель на структура)

->b доступ STRUCT элемента через указатель на структуру

Вы не парафировать ize E, который определяется как указатель. И переменные всегда должны быть инициализированы в C, прежде чем вы сможете их использовать (особенно указатели, поскольку попытка получить доступ к значению через неинициализированный указатель приведет к ошибке доступа к памяти или повреждению памяти).

+0

Да, массив и указатель такие же. Но такой же указатель на массив и массив? – testnameC04

+0

Почему не работает код b_var = N [i]. * E [j] .b ;? – testnameC04

+0

Поскольку вы пытаетесь разыменовать ** неинициализированный указатель **, который является ** Undefined Behavior **. –

Смежные вопросы