ch3-SelfReferential (typedef, struct pointer members in C/C++)

Chapter_3     Exercise_3-12     SimpleStruct2 SimpleStruct3     Exercise_3-13







SelfReferential     TCP1, p. 191  (selfreferential.c,  SelfReferential.cpp)




selfreferential.c         download


#include <stdio.h> // for printf()
// Allowing a struct to refer to itself
typedef struct SelfReferential // type name `struct SelfReferential' defined in C
{
int i;
// SelfReferential* sr; // error: type name `SelfReferential' not yet defined
struct SelfReferential* sr; // OK
} SelfReferential; // defines type name `SelfReferential' in C

int main()
{
struct SelfReferential sr1, sr2; // SelfReferential sr1, sr2;

sr1.sr = &sr2;
sr2.sr = &sr1;
sr1.i = 47;
sr2.i = 1024;

printf("sr1.i = %d\n", sr1.i); // 47
printf("(sr2.sr)->i = %d\n", (sr2.sr)->i); // 47
printf("sr2.i = %d\n", sr2.i); // 1024
printf("(sr2.sr)->sr->i = %d\n", (sr2.sr)->sr->i); // 1024
printf("(sr1.sr)->sr->sr->i = %d\n", (sr1.sr)->sr->sr->i); // 1024

SelfReferential SelfReferential; // `SelfReferential' becomes a variable name
// SelfReferential sr3; // `SelfReferential' is no longer a type name
struct SelfReferential sr3; // `struct SelfReferential' is still a type name

SelfReferential.sr = &SelfReferential; // truly SelfReferential
SelfReferential.i = 25;
printf("SelfReferential.i = %d\n", SelfReferential.i); // 25
printf("(SelfReferential.sr)->i = %d\n", (SelfReferential.sr)->i); // 25
printf("(SelfReferential.sr)->sr->i = %d\n",
(SelfReferential.sr)->sr->i); // 25
printf("(SelfReferential.sr)->sr->sr->i = %d\n",
(SelfReferential.sr)->sr->sr->i); // 25

return 0;
}
/*
gcc selfreferential.c -o selfreferential
./selfreferential
sr1.i = 47
(sr2.sr)->i = 47
sr2.i = 1024
(sr2.sr)->sr->i = 1024
(sr1.sr)->sr->sr->i = 1024
SelfReferential.i = 25
(SelfReferential.sr)->i = 25
(SelfReferential.sr)->sr->i = 25
(SelfReferential.sr)->sr->sr->i = 25
*/











SelfReferential.cpp         download


#include <iostream>
using std::cout;
using std::endl;
// Allowing a struct to refer to itself
typedef struct SelfReferential // type names `SelfReferential',
{ // `struct SelfReferential' defined in C++
int i;
struct SelfReferential* sr; // SelfReferential* sr;
} SelfReferential; // superfluous in C++
// (works without typedef...SelfReferential):
/*
struct SelfReferential // type names `SelfReferential',
{ // `struct SelfReferential' defined in C++
int i;
struct SelfReferential* sr; // SelfReferential* sr;
};
*/
int main()
{
struct SelfReferential sr1, sr2; // SelfReferential sr1, sr2;

sr1.sr = &sr2;
sr2.sr = &sr1;
sr1.i = 47;
sr2.i = 1024;

cout << "sr1.i = " << sr1.i << endl; // 47
cout << "(sr2.sr)->i = " << (sr2.sr)->i << endl; // 47
cout << "sr2.i = " << sr2.i << endl; // 1024
cout << "(sr2.sr)->sr->i = " << (sr2.sr)->sr->i << endl; // 1024
cout << "(sr1.sr)->sr->sr->i = " << (sr1.sr)->sr->sr->i << endl; // 1024

SelfReferential SelfReferential; // `SelfReferential' becomes a variable name
// SelfReferential sr3; // `SelfReferential' is no longer a type name
struct SelfReferential sr3; // `struct SelfReferential' is still a type name

SelfReferential.sr = &SelfReferential; // truly SelfReferential
SelfReferential.i = 25;
cout << "SelfReferential.i = " << SelfReferential.i << endl; // 25
cout << "(SelfReferential.sr)->i = " << (SelfReferential.sr)->i
<< endl; // 25
cout << "(SelfReferential.sr)->sr->i = " << (SelfReferential.sr)->sr->i
<< endl; // 25
cout << "(SelfReferential.sr)->sr->sr->i = "
<< (SelfReferential.sr)->sr->sr->i << endl; // 25

return 0;
}
/*
g++ SelfReferential.cpp -o SelfReferential
./SelfReferential
sr1.i = 47
(sr2.sr)->i = 47
sr2.i = 1024
(sr2.sr)->sr->i = 1024
(sr1.sr)->sr->sr->i = 1024
SelfReferential.i = 25
(SelfReferential.sr)->i = 25
(SelfReferential.sr)->sr->i = 25
(SelfReferential.sr)->sr->sr->i = 25
*/









Chapter_3     Exercise_3-12     SimpleStruct2 BACK_TO_TOP SimpleStruct3     Exercise_3-13



Comments

Popular posts from this blog

Contents