C++学习笔记(六)--结构体

1.一种自定义的类型--结构体
定义:
  struct 结构体名称 {
  //成员表列也称作域 还可以包括函数,即函数成员,不过一般结构体类型中不包含,而是放在类中。
  类型名 成员名;
  };
这种结构体类型类似于数据库中的记录
例:
struct Me{
  char name[20];
  char IDnumber[20];
  int age;
};
此时只是声明了一个Me类型,并未在内存中分配存储单元,只有定义了结构体类型的变量后,才会分配内存,类似int,float这些类型一样。

2.声明结构体变量的方法:
  a.已经定义好Me类型,则:Me me1,me2;
  b.在定义变量时就定义结构体变量:
  struct Me{
    char name[20];
    char IDnumber[20];
    int age;
  }me1,me2;

  c.没有定义结构体类型名,这种方法不建议使用:
  struct {
    char name[20];
    char IDnumber[20];
    int age;
  }me1,me2;

3.给结构体变量初始化
与所有变量一样,两种方法:
  a.定义时初始化:
  struct Me{
  char name[20];
  int age;
  }My_baby{ "Xiao_min", 22 };
  b.声明结构体类型与定义变量分开,定义变量时初始化:
  Me My_baby = { "Xiao_min", 22 };

注意:只能给结构体变量初始化,不能给结构体类型初始化,编译时只给结构体变量分配内存,不给结构体类型分配存储空间。

4.结构体变量引用
  a.可以将同类型的结构体变量整体赋值:me1 = me2;
  b.引用成员变量 me1.name[20] = "Xiao_min";//. 为成员运算符,其优先级在所有运算符中最高
  c.如果成员变量中也有结构体类型的变量就要逐级引用:
  me1.student.age;//引用结构体变量me1中的student成员中的age。
  d.要输出结构体变量的内容,只能一个一个引用输出,不能像字符数组那样直接输出。
  e.可以引用结构体变量的地址:cout <<&me1;
也可引用成员变量的地址: cout <<&me1.age;
例:
#include<iostream>
using namespace std;

struct Date{

  int month;
  int day;
  int year;
};

struct Student{

  int num;
  char name[20];
  char sex;
  Date birthday;
  float score;
}student1,student2 = { 10002, "Xiao_min", ‘f‘,12,23,1995,100 };//注意此处的初始化

int main(){

  student1 = student2;
  cout <<student1.num <<endl;
  cout <<student1.name <<endl;
  cout <<student1.sex <<endl;
  cout <<student1.birthday.month <<"" <<student1.birthday.day <<"" <<student1.birthday.year <<endl;
  cout <<student1.score <<endl;
  return 0;
}

输出结果:
10002
Xiao_min
f
12231995
100

5.结构体数组
struct Me{
  char name[20];
  char IDnumber[20];
  int age;
}me1[3] = { {"Xiao_min","110",22},{"Ding_ke","119",22},{"Luren_jia","120",22} };//即声明一个Me类型的结构体数组,数组中的每个元素都有三个域。

6.指向结构体变量的指针
一个结构体变量的指针就是该变量占据内存的起始地址。
例:
#include<iostream>
#include<cstring>
using namespace std;

int main(){

  struct Student{
    int num;
    string name;
    char sex;
    float score;
  };

  Student stu;
  Student *p;//声明一个Studeng类型的结构体指针
  p = &stu;
  stu.num = 1223;
  stu.name = "Love Min";
  stu.sex = ‘f‘;
  stu.score = 100;
  cout <<(*p).num <<" " <<(*p).name <<" " <<(*p).sex <<" " <<(*p).score <<endl;//注意这里的()不能省,why?自己分析
  cout <<p->num <<" " <<p->name <<" " <<p->sex <<" " <<p->score <<endl;//p-> 与 (*p). 等价,->称作指向运算符
  return 0;
}
输出:
1223 Love Min f 100
小结:所以引用成员变量有三种方法:
  a.结构体名称.成员名;
  b.(*p).成员名;
  c.p->成员名;//这种使用方法常在数据结构中遇到
注意:
  a.p->n++;//得到p指向结构体的成员n,先使用,再使其++,从这里可以看出->与++的优先级。
  b.++p->n;//得到p指向结构体的成员n,使其++,再使用;

7.用结构体变量 和 指向结构体变量的指针 构成链表
例:
struct Lover{
  int age;
  char name[20];
  Lover *next; //指向下一个结点的指针
};

例:单向链表
#include<iostream>
#include<cstring>
using namespace std;

struct xiao_min{
  string what_i_think_now;
  struct xiao_min *xiao_min_next;
};

int main(){

  xiao_min sentence_1,sentence_2,sentence_3;
  xiao_min *head,*p;
  sentence_1.what_i_think_now = "No matter what happens,I won‘t leave you";
  sentence_2.what_i_think_now = "because i love you.";
  sentence_3.what_i_think_now = "I miss you now!";
  head = &sentence_1;
  sentence_1.xiao_min_next = &sentence_2;
  sentence_2.xiao_min_next = &sentence_3;
  sentence_3.xiao_min_next = NULL;
  p = head;

  do{
    cout <<p->what_i_think_now <<endl;
    p = p->xiao_min_next;
  }while( p!=NULL );
  return 0;
}
输出结果:
No matter what happens,I won‘t leave you
because i love you.
I miss you now!

分析:
这种在程序中定义好的结点,不是临时开辟的,也不能用后释放,叫做 静态链表;
各个节点可以临时插入和删除的链表,这些临时插入和删除的结点没有名称,只能靠头指针查找,这样的链表称作 动态链表;建立
动态链表需要用到动态内存分配的运算符 new 和撤销动态内存分配的运算符 delete 。

8.结构体类型数据做函数参数
a.直接用结构体变量名做参数,和普通变量一样,值传递;
#include<cstring>
using namespace std;

struct Student{
  int num;
  string name;
};

int main(){

  void print( Student );

  Student stu;
  stu.num = 110;
  stu.name = "Ding";
  /* stu.name[0] = ‘D‘;
  stu.name[1] = ‘i‘;
  stu.name[2] = ‘n‘;
  stu.name[3] = ‘g‘;
  */
  print( stu );
  return 0;
}

void print( Student stu ){

  cout <<stu.num <<endl <<stu.name <<endl;
}

b.用指向结构体变量的指针作参数,将结构体变量的地址传给形参;
#include<iostream>
#include<cstring>
using namespace std;

struct Student{
  int num;
  string name;
};

int main(){

  void print( Student * );

  Student stu,*p;
  p = &stu;
  stu.num = 110;
  stu.name = "Ding";
  print( p );
  return 0;
}

void print( Student *stu ){

  cout <<stu->num <<endl <<stu->name <<endl;
}

c.用结构体变量的引用变量作函数参数。
#include<iostream>
#include<cstring>
using namespace std;

struct Student{
  int num;
  string name;
};

int main(){

  void print( Student & );

  Student stu;
  stu.num = 110;
  stu.name = "Ding";
  print( stu );
  return 0;
}

void print( Student &st ){

  cout <<st.num <<endl <<st.name <<endl;
}

9.动态分配和撤销内存的的运算符 new 和 delete
C++中用 new 和 delete 代替了C语言中的 malloc 和 free (但仍可使用,不建议),new、delete是运算符,所以效率更高。
new 使用:
  new int;//在内存开辟一个存放整数的存储空间,返回一个指向该存储空间的地址;
  new int(100);//在内存开辟一个存放整数的存储空间,初值为100,返回一个指向该存储空间的地址;
  new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回一个指向该存储空间的地址;
  new int[5][4];//开辟一个存放整型的二维数组的空间,返回一个指向该存储空间的地址;
  float *p = new float(3.14159);//开辟一个存放单精度数的空间,并指定初值,将返回该空间的地址赋给指针变量p.

小结: new [初值];
  new 返回的都是地址,且new一个数组空间时不能初始化。如果内存不足,无法开辟空间,返回空指针 NULL

delete 使用:
  delete p;
  delete []pt;//char *pt = new char[10]; []表示对数组空间操作

时间: 2024-10-11 04:40:41

C++学习笔记(六)--结构体的相关文章

C#学习笔记之结构体

1.概述 结构是一种与类相似的数据类型,不过它较类更为轻量,一般适用于表示类似Point.Rectangle.Color的对象.基本上结构能办到的类全都能办到,但在某些情况下使用结构更为合适,后面会有提到. 结构具有以下特点: 结构可以实现接口. 结构可以声明带参数的构造函数. 结构不能声明默认构造函数(没有参数的构造函数)或析构函数. 结构是值类型,而类是引用类型. 实例化结构体时可以不使用new运算符. 结构类型是不可抽象.隐式密封的,故不能使用abstract和sealed修饰符. 在结构

梓益C语言学习笔记之结构体-共用体-枚举

有人说,我们需要将不同类型的数据组合成一个整体,于是,就有了结构体 一.结构体的概念: 一种或多种基本类型或构造类型的数据的集合. 二.定义方法: 先定义结构体类型,再去定义结构体变量 struct  结构体类型名{ 成员列表 }; 如: struct stu{ int num; char name[20]; char sex; }; struct stu  lucy,bob,lilei;//定义了三个struct stu类型的变量 每个变量都有三个成员,分别是num name  sex 通常咱

C语言学习笔记-9.结构体

一.结构体的定义与使用 1.结构体内部的每个变量称为字段或成员变量 2.定义方法:struct <结构体标记> {-}; 或 typedef struct {-} <结构体类型名>; 变量定义:struct <结构体标记> 变量1,2- 或 <结构体类型名> 变量1,2- 3.成员变量的访问: x.成员变量名           (*px).成员变量名           px->成员变量名 "->"称为指向运算符或箭头运算符

c#学习笔记之结构体和接口

一.结构体 个人认为结构体就是一种简化的类,类和结构体的功能基本上差不多.但是,结构体与类在语法以及使用上也有一定的区别. 1.结构体是值类型(value types),而类是引用类型(reference types) 2.不像类一样,结构体可以不使用new来实例化一个对象. 3.结构体能声明构造函数,但是必须传入参数. 4.结构体不能从另一个结构体或类继承. 结构体的声明: public struct man { methods; } 二.接口(interface) C#中只允许单继承,也就是

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样: