一。结构体类型

结构体类型,共用体类型,枚举类型,类类型等统称为自定义类型(user-defined-type,UDT)。

结构体相当于其他高级语言中的记录(record);例如:

struct Student{

int num;

char name[20];

char sex;

int agel

float score;

char addr[30];

};

结构体声明的一般形式:

struct 结构体类型名 {成员列表};

结构体类型名用作结构体类型的标志,上面的Student就是结构体类型名。上例中num,name等都称为结构体中的成员。在声明一个结构体类型时必须对各成员都进行类型声明,即:  类型名     成员名;   每个成员称为结构体中的一个域,成员列表又称为域表。

注意:C语言中,结构体的成员只能是数据(就如上面的例子一样);C++中则对此进行了扩充,结构体的成员可以包括数据,可以包括函数(成员函数),以适应面向对象的程序设计。

二。结构体类型定义的方法和初始化

1.定义结构体类型变量的方法有一下三种:

(1)先声明结构体类型,再定义变量名。

如上面已经定义了一个结构体类型Student,可以使用它来定义结构体变量。如

Student student1,student2;

结构体变量定义之后,系统会为之分配内存单元。

C语言中,定义结构体变量时,要在结构体类型名前面加上关键字struct,C++保留了C的用法。如:struct Student student1,student2;

(2)在声明变量时,同时定义。

struct Student

{

int num;

char name[20];

int sex;

float score;

char addr[30];

}student1,student2;

这种定义的形式为:

struct 结构体名

{

成员列表

}变量列表;

(3)直接定义结构体变量类型,期一般形式:

struct

{

成员列表

}变量名列表;

记住:在编译时,是不会为类型分配空间的,只是为变量分配空间。在结构体中的成员名可以与程序中的变量名相同,但是两者没有必然联系。例如,                        在程序中可以定义一个整型变量num,它与student中的num是两回事,互不影响。

2.结构体变量的初始化。

struct Student

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}student1={10001,"wangjiun","M",19,90.5,"sahgnhai"};

也可以将声明和定义类型分开,在定义变量时进行初始化。如

Student student1={10002,"chengong",'f',20,98,"Beijing"};//Student是已经声明的结构体类型;

3.结构体变量的引用。

引用结构体变量中成员的一般方式:    结构体变量名.成员名称;   如,student1.num=10001;

"."是成员运算符。它在所有的运算符中优先级最高。因此可以将student1.num当做一个整体看。

4.结构体数组

结构体数组与数值数组不同之处:每个数组元素都是一个结构体类型的数据,她们都包括各个成员项。

定义结构体数组:和定义结构体变量的方法相仿,定义结构体数组时只需声明其为数组即可。

struct Student

{

int num;

char name[20];

int age;

float score;

char addr[30];

};

Student stu[3];//定义Student类型的数组stu

也可以直接定义一个结构体数组。如:

struct Student

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3];

或者:

struct

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3];

结构体初始化:结构体初始化与其他数组一样,对结构体数组可以初始化。

struct Student

{

int num;

char name[20];

char sex;

int age;

float score;

char addr[30];

}stu[3]={{1001,"linlin",'M',18,98.4,"Beijing"},{1002,"lijun",'F',18,98.4,"Beijing"},{1001,"wangxiajian",'M',18,90,"Shanghai"}};

定义数组stu时,也可以不指定元素个数,即可以写成:

stu[]={{...},{...},{...}};编译时,系统会根剧初始值的结构体常量的个数来确定数组元素的个数。

三。指向结构体变量的指针

一个结构体变量的指针就是该变量所占的内存段的起始地址。

可以设置一个指针变量来指向结构体变量,此时该指针变量的值就是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。

1.通过指向结构体变量的指针引用结构体变量中的成员。

#include <iostream>

#include <string>

using namespace std;
       struct gjjou
        {
                int num;
                string name;
                char sex;
                float score;
        };
       int main()
       {

gjjou stu;
                gjjou *p=&stu;
                stu.num=103001;
                stu.name="wangjingjing";
                stu.sex='F';
                stu.score=9.9;
                cout<<(*p).num<<" "<<(*p).name<<" "<<(*p).sex<<" "<<(*p).score<<" "<<endl;
                cout<<stu.name<<" "<<stu.num<<" "<<stu.sex<<" "<<stu.score<<" "<<endl;
                return 0;
         }

为了使用直观,C++提供了指向结构体变量的运算符”->“,例如,p->num表示指针p当前指向的结构体变量中的成员num。p->和(*p).num等价。以下           三种形式等价:

1.结构体.成员名。     如,stu.num;

2.(*p).成员名。   如,(*p).num;

3.p->成员名。      如p->num。”->“称为指向运算符。

注意:

p->n                     得到p指向的结构体变量中的成员n的值。

p->n++                 得到p指向的结构体变量中的成员n的值,用完该值后使它加1.

++p->n                 得到p指向的结构体变量中成员n的值,并使之加1,然后再使用它。

2.用结构体变量和指向结构体变量的指针构成链表。

3.结构体类型数据作为函数参数。

(1)用指向结构体变量的指针作为实参,将结构体变量的地址传递给形参。

(2)将结构体变量的引用变量作为函数参数。

四。动态分配和撤销内存的运算符new和delete

1.对动态链表中的节点的插入与删除,C语言中利用库函数malloc和free来分配和撤销内存空间。C++提供了运算符new和delete来取代malloc和delete。

注意:new和delete是运算符。不是函数。

new  int;//开辟一个存储空间,返回一个指向该空间的地址。

new  int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址

new  char[10]; //开辟一个存放字符数组的空间(包括10个元素),返回首地址。

new  int[5][4];  //开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址。

float *p=new float(3.141592); //开辟一个存放单精度的空间,并指定该实数的初值为3.141593,将返回的该空间地址赋给指针变量p;

new运算符使用的一般格式:

new  类型[初值];

注意:用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,new会返回一个空指针NULL;用户可以根据该指针的值判断分配空间是否成功。

delete  []  指针变量

前面撤销new开辟的存放单精度的空间,应该用 delete p;

前面用"new char[10];"开辟的字符数组空间,如果把new返回的指针赋给了指针变量pt,则应该以下面的形式撤销空间:delete  [] pt;

自定义数据类型 C++ 结构体类型 共同体类型 枚举类型 类类型{}的更多相关文章

  1. 编程C语言进阶篇——自定义数据类型:结构体

    一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...

  2. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

  3. C语言-06复杂数据类型-04 结构体

    结构体的说明(构造类型) 数组:只能由多个相同类型的数据构成 结构体:可以由多个不同类型的数据构成 ,结构体的类型是不存在的,自己定义 int main() { // 1.定义结构体类型 定义类型的时 ...

  4. 建立自己的数据类型——C结构体归纳

    一.建立结构体类型 1.申明结构体类型 struct 结构体名 { 成员表列(类型名 成员名:); }: 例如: struct Person { char name; int age; char se ...

  5. android109 结构体,联合体,枚举,自定义

    #include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...

  6. C语言基本语法——结构体、联合和枚举

    一.结构体 1.什么是结构体 2.结构体语法格式 3.结构体所占内存空间 4.结构体成员赋值 二.联合 1.什么是联合 2.联合语法格式 三.枚举 1.什么是枚举 2.枚举语法格式 一.结构体 1.什 ...

  7. C语言进阶——结构体,联合,枚举

    ----------------------------------------------------------我是一条划分线----------------------------------- ...

  8. C++-结构体,联合体,枚举,的区别

    结构体: struct  NUM { int number; }a; 结构体是声明只是一个模型,没有分配内存空间.当进行定义结构体变量后才分配内存空间 联合体: union  data { int a ...

  9. 如何让c语言使用结构体近似模拟c++中的类

    如今统治市场的主流编程语言,如c++,java,大都是面向对象类型的编程语言. 而众所周知,c语言是面向过程的编程语言,但是它拥有一个类似于类的结构,叫做结构体,主要的区别在于结构体无法定义函数. 因 ...

随机推荐

  1. Vue初级-样式

    整个网页不仅有标签还有css进行渲染,所以,现在讲讲在vue里面加入你想加的css. 在不用vue的时候,有一种内联方式加入css(大概是<div style="..."&g ...

  2. 启动MyEclipse 出现java.lang.RuntimeException: No application id has been found 解决办法

    咋一看,太熟悉了,就去eclipse\links 目录下,发现指定的MyEclipse的路径不对. 突然想起来了,MyEclipse是换地了. MyEclipse里面内置的eclipse找不到MyEc ...

  3. SAP computer之program counter

    Program counter The program is stored in memory with the first instruction at binary address 0000, t ...

  4. nvcc fatal : Unsupported gpu architecture 'compute_11'

    使用VS编译OpenCV编译源代码时候,对Cmake生成的工程文件编译,会出现 nvcc fatal : Unsupported gpu architecture 'compute_11'  问题.原 ...

  5. webapi部署到IIS 404错误

    环境:win2008r2+IIS 解决方案: 添加一个映射 可执行文件地址(根据系统决定64位可32位): C:\Windows\Microsoft.NET\Framework64\v4.0.3031 ...

  6. CorelDRAW中内置的视频教程在哪里?

    CorelDRAW中内置了很多教学内容和视频教程,可以帮助用户快速学习和掌握CorelDRAW的使用方法,创作出个性化的作品.很多小伙伴表示找不到软件自带学习视频,现在小编就来告诉你. 用户可以通过两 ...

  7. 三列布局中 float引发的一个问题-当“非float的元素”和“float的元素”在一起的时候,如果非float元素在先,那么float的元素将受到排斥。

    样式: 效果是这样的: 解答:我们发现:靠右的元素自动换行了,原因是:当“非float的元素”和“float的元素”在一起的时候,如果非float元素在先,那么float的元素将受到排斥. 解决方法: ...

  8. js对对象的校验技巧,随时更新

    js中,字符串长度用length. 若不确定一个Map里,是否存在某个对象,则用underfind 去校验

  9. springMVC知识点复习

    @ResponseBody和@RequestBody的使用 <html> <script type="text/javascript" src="rel ...

  10. 【ACM】hdu_zs1_1005_大明A+B _201307291603

    大明A+B Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submissi ...