#include <iostream>
#include <stddef.h>
using namespace std;
struct
{
int a;
char b;
float c;
} x;//创建了一个变量x,包含三个成员
/******************************************************************************************************
**这个和上面的是不同类型,不能写z = & x;
*/
struct
{
int a;
char b;
float c;
} y[20], *z;//这个声明创建了y和z。y是一个数组,包含了20个结构体。z是一个指针,指向这个类型的结构体
struct SIMPLE
{
int a;
char b;
float c;
};
struct SIMPLE x;
struct SIMPLE y[20],*z;
//这时x,y,z是同一种类型的结构变量
//**********************************************************************************************************
/*********************************************************************************************************
**使用typedef的与上面的等价
*/
typedef struct
{
int a;
char b;
float c;
} Simple;//现在Simple是一个类型
Simple x;
Simple y[20], *z;
/************************************************************************************************************
**复杂的结构成员
*/
struct COMPLEX
{
float f;
int a[20];
long *lp;
struct SIMPLE s;
struct SIMPLE sa[10];
struct SIMPLE *sp;
};
struct COMPLEX comp;
/*
**1.名字a是一个数组,表达式comp.a就选择了这个成员,这个表达式的结果是个数组名,所以可以把它用在任何可以使用
** 数组名的地方。这样便可把指针和数组等更复杂的知识用在里面
**2.类似的,成员s是个结构,所以表达式comp.s的结果是个结构的变量名,可以用在任何可以使用普通结构变量的地方。可
** 以把这个表达式用作另一个点操作符的左操作符,如comp.a.s
**3.成员sa是一个结构数组,所以comp.sa是一个数组名,它的值是一个指针常量。对这个表达式使用下标引用操作,如(comp.sa)[4]
**将选择一个数组元素,但这个元素本身是一个结构体,所以可以使用另外一个点操作符取得它的成员之一:comp.sa[4].c
**********************************************************************************************************************/
/*******************************************************************************************************************
**定义一个结构标签struct LNode来声明next
陷阱:
typedef struct
{
int data;
LNode *next;//有错误
}LNode;
*/
typedef struct lNode
{
int data;
struct lNode *next;
}LNode,*LinkList;
/*
**该结构体中的typedef只是声明LNode是个结构体类型,与解决结构体的自引用问题无关,结构体的自引用是通过标签struct LNode
**来声明next的
***********************************************************************************************************************/
int main ()
{
cout<< offsetof(struct SIMPLE,a)<<endl;
}
#include <stddef.h>
using namespace std;
struct
{
int a;
char b;
float c;
} x;//创建了一个变量x,包含三个成员
/******************************************************************************************************
**这个和上面的是不同类型,不能写z = & x;
*/
struct
{
int a;
char b;
float c;
} y[20], *z;//这个声明创建了y和z。y是一个数组,包含了20个结构体。z是一个指针,指向这个类型的结构体
struct SIMPLE
{
int a;
char b;
float c;
};
struct SIMPLE x;
struct SIMPLE y[20],*z;
//这时x,y,z是同一种类型的结构变量
//**********************************************************************************************************
/*********************************************************************************************************
**使用typedef的与上面的等价
*/
typedef struct
{
int a;
char b;
float c;
} Simple;//现在Simple是一个类型
Simple x;
Simple y[20], *z;
/************************************************************************************************************
**复杂的结构成员
*/
struct COMPLEX
{
float f;
int a[20];
long *lp;
struct SIMPLE s;
struct SIMPLE sa[10];
struct SIMPLE *sp;
};
struct COMPLEX comp;
/*
**1.名字a是一个数组,表达式comp.a就选择了这个成员,这个表达式的结果是个数组名,所以可以把它用在任何可以使用
** 数组名的地方。这样便可把指针和数组等更复杂的知识用在里面
**2.类似的,成员s是个结构,所以表达式comp.s的结果是个结构的变量名,可以用在任何可以使用普通结构变量的地方。可
** 以把这个表达式用作另一个点操作符的左操作符,如comp.a.s
**3.成员sa是一个结构数组,所以comp.sa是一个数组名,它的值是一个指针常量。对这个表达式使用下标引用操作,如(comp.sa)[4]
**将选择一个数组元素,但这个元素本身是一个结构体,所以可以使用另外一个点操作符取得它的成员之一:comp.sa[4].c
**********************************************************************************************************************/
/*******************************************************************************************************************
**定义一个结构标签struct LNode来声明next
陷阱:
typedef struct
{
int data;
LNode *next;//有错误
}LNode;
*/
typedef struct lNode
{
int data;
struct lNode *next;
}LNode,*LinkList;
/*
**该结构体中的typedef只是声明LNode是个结构体类型,与解决结构体的自引用问题无关,结构体的自引用是通过标签struct LNode
**来声明next的
***********************************************************************************************************************/
int main ()
{
cout<< offsetof(struct SIMPLE,a)<<endl;
}