c++学习之struct
2013-08-04 02:13
218 查看
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;
}
程序输出的结果如下:
![](https://img-blog.csdn.net/20130804015503796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFzb25sZWV6aGk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这里需要注意的是给结构体元素赋值的时候,由于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;
} 运行的结果还是一样。截图就不贴了。
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元素的长度了。
结构体的定义和使用
定义结构体的方法如下: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和union(结构和共用体)
- C++学习笔记二十二 - 简单的结构体struct
- C++ 学习笔记3,struct长度测试,struct存储时的对齐方式
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
- C++学习基础十三——struct和class的区别
- C++学习总结(五)——结构体(struct),联合体(union)
- C++学习之旅-结构struct
- C++ 学习笔记3,struct长度測试,struct存储时的对齐方式
- c/c++中结构体(struct)知识点强化,链表的学习
- C++学习笔记之五 复合类型之结构体(struct)
- C++学习笔记1 struct和typedef struct
- 反汇编角度深入学习C++第一课:C++的命名空间
- c++学习之--关于运算符重载
- C++学习:类成员的访问范围
- 【C++学习】C++中的new VS C语言中的malloc
- 【C++学习笔记】计算程序运行所用的时间
- C++ Boost 学习资源列表
- C++学习(43)
- 《More Effective C++》学习心得(二)
- [VS C++学习] VC中键盘按键对应的数值