本文转载于 http://pcedu.pconline.com.cn/empolder/gj/c/0503/567930_all.html#content_page_1

所有程序经过本人验证,部分程序经过修改: 验证平台 w530 ,ubuntu 12.10_x64, ecplise 4.3(with CDT)

 

1. 定义:构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,

2. 与数组不同的两点

  • 结构体可以在一个结构中声明不同的数据类型,
  • 相同结构的结构体变量是可以相互赋值的,(而数组是做不到的因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称 是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。)

3. 定义结构体使用struct修饰符

struct test { float a; int b; }; 

上面的代码就定义了一个名为test的结构体,它的数据类型就是test,它包含两个成员a和b,成员a的数据类型为浮点型,成员b的数据类型为整型

4. 如何定义结构体变量:和定义普通变量的方法一样

例如

test pn1;

  这样就定义了一test结构体数据类型的结构体变量pn1,结构体成员的访问通过点操作符进行,pn1.a=10 就对结构体变量pn1的成员a进行了赋值操作。

注意:结构体生命的时候本身不占用任何内存空间,只有当你用你定义的结构体类型定义结构体变量的时候计算机才会分配内存。

5. 如何定义结构体指针:结构指针通过->符号来访问成员

 

#include <iostream> #include <string>
using namespace std; struct test//定义一个名为test的结构体
{ int a;//定义结构体成员a
int b;//定义结构体成员b
}; int main() //在新的c++ 标准中,要使用 int main() 和 return 0
{ test pn1;//定义结构体变量pn1
test pn2;//定义结构体变量pn2
pn2.a=;//通过成员操作符.给结构体变量pn2中的成员a赋值
pn2.b=;//通过成员操作符.给结构体变量pn2中的成员b赋值
pn1=pn2;//把pn2中所有的成员值复制给具有相同结构的结构体变量pn1
cout<<pn1.a<<"|"<<pn1.b<<endl; cout<<pn2.a<<"|"<<pn2.b<<endl; test *point;//定义结构指针
point=&pn2;//指针指向结构体变量pn2的内存地址
cout<<pn2.a<<"|"<<pn2.b<<endl; point->a=;//通过结构指针修改结构体变量pn2成员a的值
cout<<pn2.a<<"|"<<pn2.b<<endl; cout<<point->a<<"|"<<point->b<<endl; return ; }

显示结果:

|
|
|
|
|
  • 结构体变量是如何作为函数参数进行传递
#include <iostream> #include <string>
using namespace std; struct test { char name[]; float socre; }; void print_score(test pn)//以结构变量进行传递
{ cout<<pn.name<<"|"<<pn.socre<<endl; } void print_score(test *pn)//一结构指针作为形参
{ cout<<pn->name<<"|"<<pn->socre<<endl; } int main() { test a[]={{"marry",88.5},{"jarck",98.5}}; int num = sizeof(a)/sizeof(test); for(int i=;i<num;i++) { print_score(a[i]); } for(int i=;i<num;i++) { print_score(&a[i]); } return ; }

显示结果

marry|88.5 jarck|98.5 marry|88.5 jarck|98.5

注意:void print_score(test *pn)的效率是要高过void print_score(test pn)的,因为直接内存操作避免了栈空间开辟结构变量空间需求,节省内存。

  • 传递结构的引用
#include <iostream> #include <string>
using namespace std; struct test { char name[]; float socre; };// 注意这要有;号 void print_score(test &pn)//以结构变量进行传递
{ cout<<pn.name<<"|"<<pn.socre<<endl; } int main() { test a[]={{"marry",88.5},{"jarck",98.5}}; int num = sizeof(a)/sizeof(test); for(int i=;i<num;i++) { print_score(a[i]); } return ; }

显示结果

marry|88.5 jarck|98.5

6. 上面我们说明了易用引用对结构体进行操作的优势,下面我们重点对比两个例程,进一部分析关于效率的问题。

例程1 例程2
#include <iostream> #include <string>

using namespace std; struct test { char name[]; float socre; }; void print_score(test &pn) { cout<<pn.name<<"|"<<pn.socre<<endl; } test get_score() { test pn; cin>>pn.name>>pn.socre; return pn; } int main() { test a[]; int num = sizeof(a)/sizeof(test); for(int i=;i<num;i++) { a[i]=get_score(); } for(int i=;i<num;i++) { print_score(a[i]); } return ; }

 

#include <iostream> #include <string>
using namespace std; struct test { char name[]; float socre; }; void print_score(test &pn) { cout<<pn.name<<"|"<<pn.socre<<endl; } void get_score(test &pn) { cin>>pn.name>>pn.socre; } int main() { test a[]; int num = sizeof(a)/sizeof(test); for(int i=;i<num;i++) { get_score(a[i]); } for(int i=;i<num;i++) { print_score(a[i]); } return ; }

 

(转) 新手入门:C/C++中的结构体的更多相关文章

  1. 《挑战30天C++入门极限》新手入门:C/C++中的结构体

        新手入门:C/C++中的结构体 什么是结构体? 简单的来说,结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构 ...

  2. 《挑战30天C++入门极限》新手入门:C++中堆内存(heap)的概念和操作方法

        新手入门:C++中堆内存(heap)的概念和操作方法 堆内存是什么呢? 我们知道在c/c++中定义的数组大小必需要事先定义好,他们通常是分配在静态内存空间或者是在栈内存空间内的,但是在实际工作 ...

  3. 《挑战30天C++入门极限》新手入门:C++中的函数重载

        新手入门:C++中的函数重载 函数重载是用来iostream>  using namespace std;  int test(int a,int b);  float test(flo ...

  4. 《挑战30天C++入门极限》新手入门:C++中布尔类型

        新手入门:C++中布尔类型 布尔类型对象可以被赋予文字值true或者false,所对应的关系就是真与假的概念. 我们通常使用的方法是利用他来判断条件的真与假,例如下面的代码: #include ...

  5. javascript基础入门之js中的结构分支与循环语句

    javascript基础入门之js中的结构分支与循环语句 程序的结构①顺序结构:自上而下:②选择(分支)结构:多条路径,根据不同的条件,只执行其中一个:③循环结构:重复某些代码④配合特定的语句实现选择 ...

  6. C++中的结构体

    http://zhidao.baidu.com/link?url=8OYQSKV9mvSBc6Hkf9NsLQmipSge9VCZDJQGAZZs5PCBQ54UTmK98VRmAklEEAFYu7d ...

  7. C/C++中的结构体

    结构体定义 结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.   结构体作用 结构体和其他类型基础数据类型一样,例如int类型,char类型 只不过结构体可以做成 ...

  8. C语言中的结构体,结构体数组

    C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...

  9. 再识C中的结构体

    在前面认识C中的结构体中我介绍了结构体的基础知识,下面通过这段代码来回顾一下: #include<stdio.h> #define LEN 20 struct Student{ //定义结 ...

  10. C语言中的结构体和C++中的结构体以及C++中类的区别

    c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一. ...

随机推荐

  1. OpenCV——级联分类器(CascadeClassifier)

    级联分类器的计算特征值的基础类FeatureEvaluator 功能:读操作read.复制clone.获得特征类型getFeatureType,分配图片分配窗口的操作setImage.setWindo ...

  2. MyISAM 存储引擎

    在MYSQL 5.1 以及之前的版本,MyISAM 是默认的存储引擎.MyISAM 提供了大量的特性,包括全文索引,压缩,空间函数(gis)等,但是MyISAM不支持事务和行级锁,而且有一个毫无疑问的 ...

  3. WCF+AJAX最佳实践

    本文是基于Frank Xu的一个webcast上的串并总结,图片等都截至视频,谨致谢. 路线图 什么是WCF Windows Communication Foundation是MS为构建面向服务的应用 ...

  4. 畅通工程再续--hdu1875

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  5. IOS 文件管理 2

    IOS开发-文件管理(二) 五.Plist文件 String方式添加               NSString *path = [NSHomeDirectory( )  stringByAppen ...

  6. 深入理解 静态类和静态字段(C# 基础)

    序言 以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧. 静态类 定义 静态类与非静态类的重要区别在于静态类不能实例 ...

  7. js 实现音乐播放

    <html><head><title>这种方式支持任何浏览器</title></head><body><div id=&q ...

  8. CentOS终端操作mysql

    1.停用mysql服务:service mysqld stop 重启mysql服务:service mysql restart 2.mysql 1045ERROR:mysqld_safe --user ...

  9. Qemu对x86静态内存布局的模拟

    快乐虾 http://blog.csdn.net/lights_joy/ lights@hb165.com 本文适用于 QEMU-0.10.5 VS2008 欢迎转载,但请保留作者信息 在PC机中,由 ...

  10. qt QSortFilterProxyModel

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.Qt import * from PyQt4. ...