c++学习之struct
来源:互联网 发布:云计算是什么工作 编辑:程序博客网 时间:2024/05/30 19:33
struct的主要作用就是将各种类型的信息聚集在一起,形成一个完成的结构体,这种结构体非常类似于我们平常所说的对象了。只是它并没有提供接口方法而已。
结构体的定义和使用
定义结构体的方法如下:
struct movie_t{char title[13];int price;};
使用的时候,我们只用声明一个变量,然后直接赋值即可。看一个完整的例子。
#include <iostream>using namespace std;struct movie_t{char title[13];int price;};int main(){movie_t pb;strcpy(pb.title,"prisonbreak");pb.price = 12;cout << pb.title << " : " << pb.price << endl;cout << sizeof(pb) << endl;movie_t *friends = &pb;strcpy(friends->title,"friends");friends->price = 13;cout << friends->title << " : " << friends->price << endl;cout << sizeof(*friends) << endl;return 0;}
程序输出的结果如下:
这里需要注意的是给结构体元素赋值的时候,由于title是一个字符数组类型,因此不能直接用赋值符号,要用strcpy函数来做。
另外,我们定义了一个结构体指针,通过指针来找到对应的元素,我们可以使用->符号。
上面的例子中,我们声明结构体变量的时候,其实也可以按照如下的方式进行声明。即在定义结构体的时候同时进行声明。
#include <iostream>using namespace std;struct movie_t{char title[13];int price;}pb,*friends;int main(){//movie_t pb;strcpy(pb.title,"prisonbreak");pb.price = 12;cout << pb.title << " : " << pb.price << endl;cout << sizeof(pb) << endl;friends = &pb;strcpy(friends->title,"friends");friends->price = 13;cout << friends->title << " : " << friends->price << endl;cout << sizeof(*friends) << endl;return 0;}运行的结果还是一样。截图就不贴了。
结构体的长度
现在再来说说结构体的长度问题,按照普通类型的方法来计算,即使用sizeof()函数。
struct stru{char name;int age;};
我们定义以上的结构体,通过sizeof(stru)的方法来计算,得到的长度是8.按照我们平常的计算,char类型是1个字节,int是4个字节,加起来应该是5个字节,但是这里是8,主要是因为编译器对其进行了优化,结构体的长度是按照结构体里面长度最大的元素进行对齐,因此将char计算为4字节。
再看看另外一个情况:
struct stru{char name;char sex;int age;};
以上这个结构体定义计算出来的长度结果是8,编译器在做计算时,按照顺序,从name开始计算,按照里面长度最大的元素为基准,自动对齐,如果遇到后面一个元素也不到这个最大长度,会对齐进行合并,合并的结果必然是2的n次方,这样的话,在内存中,寻址的效率是最高的。
再看一种情况:
struct stru{char name;int age;char sex;};
以上的计算结果是12,其实是说明,编译器在计算时,仅仅按照顺序,并不会因为第一个和第三个可以在数量上进行合并,编译器就做合并,因为合并的动作,是不会跳着进行计算的。计算完name的长度是1,发现下一个age元素的长度是4,所以就将name元素所占的长度自动扩充到4了。最后就计算sex元素的长度了。
- C语言学习之结构体struct
- c语言之struct
- objective-c之struct
- Objective-C学习笔记-之结构体struct
- ⑤NDK学习之C语言结构体struct
- ⑥NDK学习之C语言结构体struct例子
- c++学习之struct
- C结构体struct学习
- c语言之结构(struct)
- golang学习之--struct类型
- swift简单学习之Struct
- 从C转到JAVA学习路之struct与class对比
- 【xv6学习之番外篇】详解struct Env 与 struct Trapframe
- C#/WPF学习笔记:class 与 struct
- c语言之不再害怕sizeof(struct)
- C语言之结构体struct
- C语言之struct结构体
- C++学习之旅-结构struct
- Ubuntu上Oracle VM VirtualBox安装和配置
- 求整数的二进制表达中有多少个1
- ThinkPHP视图模型动态改变视图联表字段,因为D方法的伪单例而产生BUG的错误处理
- 组合和聚合的区别
- Call to hostname/x.x.x.x:9000 failed on connection exception:java.net.ConnectException
- c++学习之struct
- maven项目从myeclipse转到eclipse的艰辛历程
- hdu 4630 no pain no game 树状数组+离线查询
- Java多线程
- 数字组合
- 联想s310/s410/s415/s400由uefi boot转legacy boot
- Assignment 8: Network Flow Problems
- OBTAINING SPRING 3 ARTIFACTS WITH MAVEN
- Ubuntu 没有mkinitrd 解决方法