您的位置:首页 > 编程语言 > C语言/C++

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;
}

        程序输出的结果如下:



        这里需要注意的是给结构体元素赋值的时候,由于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元素的长度了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: