1.3. Структуры
Оба языка и Паскаль, и Си позволяют определить унифицированные и неоднородные структуры данных.
В Паскале они называются записи(records), а в Си - структуры.
Формат для обоих:
Турбо Паскаль Турбо Си
type typedef struct {
<rname>=record <type><fnames>;
<fnames>:<type>; <type><fnames>;
<fnames>:<type>; ...
... <type><fnames>;
<fnames>:<type> } <rname>;
end;
var
<vnames>:<rname>; <rname><vnames>;
Существует также более строгий формат в Си для прямого определения структур переменных, более аналогичный формату Паскаля.
Турбо Паскаль Турбо Си
var
<vnames>:record struct<rname>
{
<fnames>:<type> <type><fnames>;
... ...
<fnames>:<type> <type><fnames>;
end; } <vnames>;
В этом варианте, <rname> необязательная структура; вы должны записать ее, если планируете объявить другие переменные типа <rname>. Кроме того, записи в Паскале и структуры в Си довольно близки.
Турбо Паскаль Турбо Си
Type
Student=record struct student {
Last,First:string[20]; char last[20],first[20];
SSN : string[11]; char ssn[11];
Fgt : Integer; int age;
Tests: array[1..5] if integer; int tests [5];
GPA : Real float gra;
end; } current;
var main ()
Current: Student; {
begin
Current.Last='Smith'; strcpy(current.last,"Smith");
Current.Age =21; current.age=21;
Current.Test[1]=97; current.test[0]=97;
Current.GPA=3.94; current.gpa=3.94;
end }
Главное различие между Паскалем и Си в том, что в Паскале имеются операторы, а в Си - нет. Мы могли бы переписать код на Паскале, использовав выше оператор with Current do , и затем ссылаться на поля без указания в начале Current. В Си вы всегда должны указывать Current в начале. Однако, Си также имеет оператор доступа member (->), используемый, когда идентификатор слева от оператора является указателем на собственную структуру. Для примера, если pstudent является указателем на struct, тогда
strcpy(pstudent -> last,"Jones");
присвоит переменной last строку "Jones".