C++从零开始 三(C++ Primer Plus 第六版)

第四章 复合类型(由于赶时间,本章笔记主要以运用、实践为主)

一、数组

1、数组的初始化规则

正确:

  • 方式一

  • 方式二

  • 方式三

错误:

  • 方式一(只有在定义数组时才能使用初始化(初始化便是:{1,2,3,4}),此后就不能使用了)

 

  •  方式二(不能将一个数组赋给另一个数组) 

  • 方式三(自我理解:定义数组时,没给数组长度,也没初始化,所以也就没给它地址和内存空间,等于这个数组作废,没有用)

 2、C++11数组初始化方法:

 3、得到数组的长度 

  • 补充:这里的sizeof加不加括号均可。

二、C-风格字符串

1、char类初始化规则

正确:

 

错误:(三个方法的问题与数组的问题一一对应)
 

 2、char类的长度给定(与数组不同)

  • char类:

        如果想输出的字符串为 "asdf" ,则:

        char a[5] =  "asdf" ;(因为char类需要给 \0 留个位置,”asdf“ → {‘a’ , 's', 'd' , 'f' , '\0' })

  • 数组:

        如果想输出{1,2,3,4},则:

        int a[4] = {1,2,3,4};

3、得到char类长度

#include <cstring>

type(数字整型和浮点型都可) a = strlen( char类);

4、字符串与字符串连接

        #include <cstring> 

  • 解释:

        strcpy():将字符串复制到字符数组中;

        strcat():将字符串附加到字符数组中。

  • 例子:

5、其他形式的字符串字面值

  • 类型不同

  • 输出时的 “ ” 

三、string类字符串

1、string类的初始化规则

与python用法相差不大。

2、得到string类长度

type(数字整型和浮点型都可) a = string类.size()

 3、字符串与字符串连接

   ”  +   “ 连接

四、结构、共用体

1、结构体:

  • 结构的组成

  • 使用结构体
#include <iostream>
using namespace std;

//方式一:普通版
struct onf
{
    char a;
    double c ;
    };



//方式二:可以用初始化以这种方式创建的变量
struct inf {
    char a;
    int b[4] ;// 中括号里不能为空,字符串同理
    double c ;
}inf_a = {
    'a',
    {1,2,3,4},
    1.2
};


//方法三:同时完成定义结构和创建结构变量的工作
struct enf {
    char a ;
    double b;
}enf_a;


//方法四 :少用版
struct {
    char a;
    double b ;

}rnf;


/*------------------------------------------------------------------------------*/


int main(){
    // 方法一
    onf onf_a {
        'a',
        1.2
    };
    cout << onf_a.a;
    cout <<endl;

    // 方法二
    cout << inf_a.a;

    //方法三
    enf enf_a={ //可省略等号
        'a',
        1.2
    };
    
    //方法四
     rnf ={ //注意!!!等号不能省
        'a',
        1.2 };

    return 0;

}

  • 结构数组

 

  • 结构中的位字段

  • 附加:

如果大括号内未包含任何东西,各个成员都将被设置未零;

不允许窄缩转换。

2、共用体

  • 定义: 

共用体能够存储不同的数据类型,但只能同时存储其中的一种类型,也就是说,结构可以同时存储int、long 和 double,共用体只能存储int、long 或 double。

  • 例子:

  • 匿名共用体:

五、指针

1、申明和初始化指针

#include <iostream>
int main(){
using namespace std;

//整型和浮点型
int *a ; // 1、int* a or int * a or int*a 均可;    2、a 为 地址 ;*a为该地址存的内容

//赋值方法
int b = 8;
//方法一:地址
a = &b; // a = 8 or a = &8 or a = &(8)都是错的

//方法二 :内容
*a = b;//*a = 10 直接赋值的方式也可以,但是不能在初始化的时候直接赋值

//方法三:地址简化版
//int *a = &b //这个是简化:方法一的简化


cout<<"地址:"<<a<<endl; // a 为 地址 
cout<<"内容:"<<*a<<endl; //*a为该地址存的内容


/*下面的声明创建一个指针(p1)和一个int变量(p2)

int *p1 , p2;

注意:不能直接给指针赋值(例如int *a = 8 )!!!
但是,可以给它地址 :int *a=(int*)0xB8000000

*/

return 0;



}

2、使用new来分配内存与使用delete释放内存

  •         注意养成习惯,搭配起来用 

        数组:

         注意:

 

3、使用new来创建动态数组

#include <iostream>

int main(){

    using namespace std;

    int *a = new int [500];
    char *c_a = new char [500];
    int b[]={1,2,3,4};
    char d [] = "adsagfc";

    /*直接赋值:char 与数字整型、浮点型的区别
    //char类
    c_a = "sad";    //弹问题,但是能输出(*c_a = "sad"会报错)
    
    //数字整型、浮点型
    *a = {1,2,3,4};     //报错

    */

   /*一个个赋值:char 与数字整型、浮点型一样
    //char类
    c_a[0]='a';

    //数字整型、浮点型
    a[0] = 1;
    */

   /*用数组的变量赋值
    //char类
    c_a = d; //d为字符串内容;c_a = &d:错误
    cout << *c_a <<c_a[0]<<*(c_a+1)<<endl; //输出结果:aad;

   //数字整型、浮点型
    a = b; //b 为数组的地址
    cout <<*a<<a[0]<<*(a+1); //输出结果:112;

    */

   //得到指针长度
   cout<<endl<<sizeof(a);
   
   //得到字符串的地址
   cout<<endl<<(int*)c_a;

    return 0;

}
  • 注意:

 4、使用new创建动态结构

#include <iostream>

using namespace std;

struct inf{
    int a;
    char b;
};

int main(){
    /*初始化

    //方法一
    inf inf_a = {2, 'a'};
    inf *inf_A = &inf_a;

    //方法二
    inf *inf_A;
    inf_A = &inf_a; //*inf_A = inf_a;会出现异常
    
    //方法三
    inf *inf_A = new inf;
    *inf_A = inf_a;// or inf_A = &inf_a

    */

    /* “->”的用法

    inf *inf_A = new inf;
    inf_A -> a = 2;
    inf_A -> b = 'a';
    
    cout<< inf_A -> a; //输出:2

    */

    return 0;
}

六、模板类vector、array

1、vector类(类似于string类,是动态数组)

2、array类(使用栈,静态内存分布,相对于vector类,效率高)

 

 

七、get() 与 getline():面向行的类(这两个类函数都能读取一行输入)

1、getline():丢弃换行符

例子一(char类):

输出:

例子二(string类):

2、get():将换行符保留在输入序列中

例子一(char类):

 输出:

 例子二(string类):无该使用

3、混合输出(有cin<<year的情况):  

  • 例子(cin>>year在前):

  • 如果cin<<year在后:则可以不加get(),不需要处理换行符

4、get() 与 getline()的区别:

getline()使用起来简单一些,但get()使得检查错误更简单些。

5、空行问题:

八、枚举

略~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值