c/c++结构体知识介绍



1.结构体类型定义

定义方式1

Typedef struct  LNode {

   int  data;  // 数据域

   struct LNode   *next;  // 指针域

} *LinkList;

 

定义方式2

struct  LNode {

   int  data;  // 数据域

   struct LNode   *next;  // 指针域

}

Typedef struct  LNode  *LinkList;

以上两个定义方式是等价的,是将*LinkList定义为struct  LNode类型,即LinkList被定义为一个类型名。这样就可以用LinkList来定义说明新的变量了,如:

LinkList  L

即将L定义为struct  LNode类型的指针变量

 

2.结构体类型变量定义

定义方式1

struct  LNode {

   int  data;  // 数据域

   struct LNode   *next;  // 指针域

}LnodeA

定义方式2

struct  LNode {

   int  data;  // 数据域

   struct LNode   *next;  // 指针域

}

struct  LNode LnodeA

以上两个定义方式也是等价的,这样就将LnodeA定义为一个truct  LNode类型的变量,即LnodeA为一个truct  LNode类型的变量名。

3.结构体的大小与内存对齐

结构体的大小不是结构体元素单纯相加就行的,因为我们现在主流的计算机使用的都是32Bit字长的CPU,对这类型的CPU4个字节的数要比取一个字节要高效,也更方便。所以在结构体中每个成员的首地址都是4的整数倍的话,取数据元素是就会相对更高效,这就是内存对齐的由来。

每个特定平台上的编译器都有自己的默认对齐系数”(也叫对齐模数)。程序员可以通过预编译命令#pragma pack(n)n=1,2,4,8,16来改变这一系数,其中的n就是你要指定的对齐系数。  

规则:  

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。  

2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。  

3、结合12颗推断:当#pragma packn值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

4.C++中的结构体

C语言中,可以定义结构体类型,将多个相关的变量包装成为一个整体使用。在结构体中的变量,可以是相同、部分相同,或完全不同的数据类型。C语言中,结构体不能包含面向对象的程序设计中,对象具有状态(属性)和行为,状态保存在成员变量中,行为通过成员方法(函数)来实现。C语言中的结构体只能描述一个对象的状态,不能描述一个对象的行为。C++中,考虑到C语言到C++语言过渡的连续性,对结构体进行了扩展,C++的结构体可以包含函数,这样,C++的结构体也具有的功能,与class不同的是,结构体包含的函数默认为public,而不是private。  


C++控制台输出例子:  

#include <cstdlib>  

#include <iostream>  //定义结构体  

struct point  

{  

//包含两个变量成员  


int x;  

int y;  

};  

using namespace std;  

int main(int argc, char *argv[]) 

 {  

struct point pt;  

pt.x=1;  

pt.y=2;  

cout<<pt.x<<endl<<pt.y<<endl;  

return EXIT_SUCCESS;  

}

5.C++中的结构体与类的区别

类与结构体在C++中只有两点区别,除此这外无任何区别。  

(1)class中默认的成员访问权限是private的,而struct中则是public的。  

(2)class继承默认是private继承,而从struct继承默认是public继承

6.这两种定义的区别

typedef struct student

{

 int num;

 struct student *next;

}student;

struct student

{

 int num;

 struct student *next;

};

第二个struct student是定义了一个student结构体,这个明白吧。

第一个是用typedefstruct student这个结构体类型名字重新定义为student,也就是说struct studentstudent表示同一个事物,都是一个类型的标识符,比如 typedef int zhengshu; 就是你把整型int重命名为zhengshu,下面定义:int i; zhengshu i; 两句就是等价的了


http://blog.sina.com.cn/s/blog_4b146a9c0100zo7a.html

发布了2 篇原创文章 · 获赞 20 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章