标签:
聚合数据结构:数组
结构体
结构体值的集合称为成员
数组通过下标,结构体通过名字访问–区别非常重要
结构体与数组不一样,并不能替换为指针。
结构体属于标量不能进行加减乘除,但可以赋值
在C语言中,并没有规定结构体所分配的内存是连续的,但是有些编译器会分配连续的空间给结构体
struct
{
int x;
}z;
struct
{
int x;
}y;
z = y
//error 不能将struct <unnamed>类型的值分配到struct <unnamed>
struct a
{
int x;
}f;
//**a标识了一种模式,用于声明变量。**
typedef struct b
{
int x;
}h;
//因为有typedef的存在,所以在这里h表示的是一种类型,而不是一种变量。
结构体中可以包含很多类型的数据
struct COM
{
int h;
char b;
float c[20];
double d;
struct a;
};
COM.h;
(COM.a).a;
//双结构体的直接访问
(COM.c)[4]
//下标引用和点操作符具有相同的优先级
如果有指向结构体的指针,则用箭头运算符来进行间接访问成员。
struct as
{
int a;
char b;
};
struct as *p;
p->a;
p->b;
//OR
(*p).a;
(*p).b;
这是两种操作符的区别
struct St
{
int a;
int c;
struct St;
};
//error 会导致结构体无限制的引用下去
struct St1
{
int a;
int c;
struct St1 *p;
}
//OK.
typedef struct
{
int a;
int c;
struct St1 *p;
} St2;
//error St2为自己所定义的类型,但是在这个类型内部,这个结构体还没定义就已经使用,明显是非法的。
typedef struct
{
int a;
short b;
} EX2;
typedef struct EX
{
int a;
char b[3];
EX2 c;
struct EX *b;
} EX;
EX x= {10,"Hi",{5,{-1,25}},0};
EX *px = &x;
再次重申:
在C语言中,并没有规定结构体所分配的内存是连续的,但是有些编译器会分配连续的空间给结构体
px指向结构体的第一个元素。
*(P+1)是非法的,原因同上
比较*p and p->a;
这两种操作都是指向结构体的第一个元素,但是略有不同。
*p指代的是整个结构体
p->a,指向的是他的第一个成员。
int *fp;
fp = p;//error,类型不匹配
p->c.a
p->c指向结构体C,结果并不是一个指针,而是一个变量。所以用c.a来直接访问
*(p->c.b)指向结构体c的数组b的第一个元素
由于结构体本身就是自定义的数据类型,定义结构体变量的方法和定义普通变量的方法一样。
注意:结构体生命的时候本身不占用任何内存空间,只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存。
结构体,同样是可以定义指针的,那么结构体指针就叫做结构指针。
结构体可以描述数组不能够清晰描述的结构,它具有数组所不具备的一些功能特性。
void print_score(struct a*pn)的效率是要高过void print_score(struct a pn)的,因为直接内存操作避免了栈空间开辟结构变量空间需求,节省内存。
标签:
原文地址:http://blog.csdn.net/qq_24085431/article/details/51366732