zoukankan      html  css  js  c++  java
  • 学习C++.Primer.Plus 4 复合类型

    本章介绍的有复合类型有: 数组、 字符串、 结构、 共用体、 指针

    数组:

    声明数组时数组长度必须为常量(或const)。

    只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外其它全默认为0:

    int myArr[10] = {10,8};

    初始化时数组长度不设时,编译器会根据内容计算元素个数:

    int myArray[] = {3,2,45}

    字符串:

    C风格的字符串后面都要有'',否则不是字符串;引号括起来的字符串隐藏带'':

    char dog[4] = {'x', 'j', 'p', ''};
    char wolf[4] = "ply";

    用cout输出时打印直到遇到''(空字符)时为止。

    C++中带引号的“S”表示的是字符串所在的内存地址。

    C++中任何两个由空白(空格、制表符、换行符等)分隔开的两个字符串都会自动拼接成一个,前者的末尾''将被后者的首字母取代:

    cout << "wha"
        "t a big NiuBi!";
    //将输出what a big NiuBi!

     sizeof(数组)计算的是整个数组的长度。而strlen()计算的是数组中可见字符串的长度:

    char arr[15] = "sb";
    int size = sizeof(arr);//15
    int len = strlen(arr);//2

    输入字符串:

    使用cin>>返回cin对象,输入时会以空白(制表符、换行符、空格)来定界。获取单词后,将剩余部分留在输入队列中。

    cin.getline(数组,数量):遇到换行 或 达到数量时停止。遇到换行时丢弃换行符。

    cin.get(数组,数量):遇到换行 或 达到数量时停止。会将换行符留存输入队列中。

    cin.get():读取下一个字符(即使是换行符)。

    cin.get(...)和getline(...)都可以拼接:

    cin.get(arr, 5).get();
    cin.getline(arr, 5).getline(arr2, 6);

    可以用cin.get方法来判断是输入结束是因为 输入满数量还是回车。din.get读取空行后会设置失效位,关闭后面的输入,可以用cin.clear()来恢复输入。

    cin.getline 在输入行的数量比指定的多时会设置失效位并阻断输入。cin.get和cin.getline都会将剩余的部分留在输入队列。

    字符串

    可以用strcpy拷贝到字符数组中,用strcat复制到字符数组的末尾。

    另外接受拷贝长度参数的strncpy()和strncat();

    用strlen()和string对象.size()获取字符串长度。

    getline(cin, str)用来获取输入整行字符串对象

    结构

    声明无名结构

    struct
    {
      string name;
      int age;
    } xjp;

     结构中的位字段:占特定位数的结构成员,字段类型应为整型或枚举型,也可以使用无名的位字段来提供间距:

    struct niubi
    {
        unsigned int SN: 4;//SN字段占4位
        int: 32;//占32位的间距
    }

    共用体:

    可以存储不同的数据类型,但一次只能存储一种类型,其长度是最大成员的长度,且对同一对象的不同成员地址相同:

    union one4all
    {
        short int int_val;
        double dbl_val;
        long double lngdbl_val;
    };

    枚举:

    枚举量默认值第一个为0,后边的比前边的大1.

    枚举只定义了赋值操作符,不能进行算术运算。

    枚举可以隐式转换为int型,但int 不能隐式转换成枚举型,但可以把有效的int强制转换成长枚举型。

    枚举的取值范围:最大值:大于最大枚举量的 最小 2n-1;最小值:如果最小枚举量>0,则最小值为0,否则类似最大值的做法,加上负号。

    指针:

    声明时每个指针都要有*(解除引用符号,得到地址处的值):

    int *p1, p2;//声明一个指向int的指针p1, 和一个int型的p2

    再次使用时p1表示地址,*p1表示p1地址处的值。声明时int *是一种复合类型,表示指向int的指针,声明语句初始化时,被初始化的是指针:

    int *p1 = &p2;//p1(而非*p1)的值设置为&p2

    注:一定要在使用*p1之前初始化指定它所指向的内存地址。

    把整型转换为指针型需要强制转换:

    int *pt = (int *)0xB8000000;

    new:

    一定要配对地使用new 和delete。否则会发生内存泄漏。

    new 成功时返回分配的内存地址,不成功时会返回0。

    delete只能释放通过new 分配的内存,而且不能重复释放。

    int *pt = new int;
    ...
    ...
    delete pt;
    int l = 5;
    int *pl = &l;
    //delete pl;//错误

    静态联编与动态联编:编译时就为数组分配内存称为静态联编,运行时通过new来分配内存称为动态联编。

    对于数组,使用delete时带不带中括号[]要和new创建时一致。

    对于为实体分配内存,即使使用new+[],delete时也不要带[]。

    可以delete空指针。

    使用new[]得到的内存不是公有的,如:可以使用delete[]释放,但不能用sizeof()来获取长度。

    int *psome = new int[10];
    ...
    delete []psome;

    用指针指向数组时,指向第一个元素,当指针+1时,指向的地址增加了指向类型的字节数:

    int *psome = new int[10];//psome指向数组[0]
    ...
    psome = psome +1;//psome指向数组[1]

    C++将数组名解释为第一个元素的地址。大多数情况下,可以像使用数组名那样使用指针。*(arrayname +1) 等同于 arrayname[1]。

    但数组名是常量,而指针可以更改值。

    sizeof(数组名)得到数组长度,而sizeof(指针)得到指针的长度(一般为4个字节)。

    指针的相减运算:只有当两个指针指向同一个数组时才有意义,得到的是两个元素之间的间隔。

    C++中,指向char的指针、char数组名 和 引号括起来的字符串常量都被解释为第一个字符的地址。

    cout打印指针时将打印地址,如果指针类型为char *,则将打印字符串。要显示地址则转换成另一种类型的指针,如int *:

    char arr[10] = "xjp";
    char *pa = arr;
    cout << pa << endl//char *类型,xjp
        << (int *)pa;//输出地址
    int arr1[10] = {33, 44,55};
    int  *pi = arr1;
    cout << pi;//输出地址

    strcpy和strncpy复制时,如果目标长度太大,会把多余的部分放到后面的内存中,不会自动在末尾添加空字符。保险起见,使用arr[最大长度-1] = '';

    字符串数组赋值时不能直接使用 = ,使用strcpy/strncpy。

    new 结构:

    struct DN
    {
        string name;
    }dn;
    DN *ps = new DN;
    (*ps).name = "xjp";//*ps表示结构变量本身
    ps -> name = "xjp";
    dn.name = xjp;

    C++的3种管理数据内存的方式:自动存储、静态存储 和 动态存储(new-delete)。

  • 相关阅读:
    GitHub上受欢迎的Android UI Library
    推荐的优秀博客--多关注,多看看
    Android SDK在线更新镜像服务器大全
    SqlServer查看各个表所占空间大小的sql
    演化理解 Android 异步加载图片
    tsp、rtmp测试地址
    eclipse离线安装Properties Editor插件查看配置文件中Unicode内容
    亲测成功关闭谷歌浏览器自动更新方法分享 取消chrome自动更新
    SQL Server 中用While循环替代游标(Cursor的解决方案
    【转】service和serviceImpl的选择
  • 原文地址:https://www.cnblogs.com/yuantf/p/3155161.html
Copyright © 2011-2022 走看看