结构体(有数组和指针)

这篇博客详细介绍了C++中结构体的使用,包括如何创建含有数组和指针的结构体,以及结构体变量的声明和初始化。同时,讲解了typedef在结构体定义中的作用,特别是处理结构体自引用的情况,并给出了结构体成员访问的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值