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
Post a Comment