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

数组:

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

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

int myArr[] = {,};

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

int myArray[] = {,,}

字符串:

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

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

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

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

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

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

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

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

输入字符串:

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

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

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

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

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

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

可以用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: ;//SN字段占4位
int: ;//占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 = ;
int *pl = &l;
//delete pl;//错误

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

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

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

可以delete空指针。

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

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

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

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

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

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

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

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

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

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

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

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

字符串数组赋值时不能直接使用 = ,使用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)。

学习C++.Primer.Plus 4 复合类型的更多相关文章

  1. C++ Primer Plus 第四章 复合类型 学习笔记

    第四章 复合类型 1. 数组概述 1.1 数组的定义 数组(array)是一种数据格式,能够存储多个同类型的值.每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素. 数组声明的三 ...

  2. c++学习总结--复合类型,const。

    复习c++,有必要对一些东西做一下笔记,方便以后学习,如有问题,欢迎提出. 首先,最常用两种复合类型应该是引用和指针. 所谓复合类型,是在基本类型基础(如:int)上定义的类型. 引用是c++的一个复 ...

  3. C++Primer快速浏览笔记-复合类型

    C++Primer2.3节介绍了两种复合类型:引用和指针 1.引用 引用并非对象,它只是为一个已经存在的对象所起的别名. 一旦初始化完成,引用将和它的初始值对象一直绑定在一起,不能重新绑定到另一个对象 ...

  4. oracle学习 十一 包+复合类型+自定义异常(持续更新)

    在这里讲一下包的概念, 二话不说上个例子 包头: create or replace package pck_test is procedure proc_report_salary(name nva ...

  5. 《C++ Primer Plus》读书笔记之二—复合类型

    二.第四章 复合类型  1.C-风格字符串:C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写成\0,其ASC||编码为0,用来标记字符串的结尾.例如: char dog[5]={'b','e ...

  6. 02.第二章_C++ Primer学习笔记_变量和基本类型

    2.1  基本内置类型 2.1.1  算术类型 算术类型包括两类:整型和浮点型 2.2  变量 2.3  复合类型 2.4  const限定符 2.5  处理类型 2.6  自定义数据结构

  7. C++ primer plus读书笔记——第4章 复合类型

    第4章 复合类型 1. 如果将sizeof运算符用于数组名,得到的将是整个数组中的字节数. 2. 如果对数组的一部分进行初始化,则编译器把其他元素设置为0.因此,将数组中的所有元素初始化为0,只要显式 ...

  8. 第54讲:Scala中复合类型实战详解

    今天学习了scala的复合类型的内容,让我们通过实战来看看代码: trait Compound_Type1trait Compound_Type2class Compound_Type extends ...

  9. C++ Primer 变量和基本类型

    <C++ Primer 4th>读书摘要 基本上所有的语言都要提供下列特征: • 内置数据类型,如整型.字符型等. • 表达式和语句:表达式和语句用于操纵上述类型的值. • 变量:程序员可 ...

随机推荐

  1. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)

    一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...

  2. DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS

    今天在测试.验证DROP_SNAPSHOT_RANGE不能彻底快照的过程中遇到了DROP_SNAPSHOT_RANGE无法清理WRM$_SNAPSHOT_DETAILS表中数据的情况,测试服务器版本为 ...

  3. Linux SendMail发送邮件失败诊断案例(三)

    一Linux服务器突然发送不出邮件,检查了很多地方都没有发现异常,检查/var/log/maillog发现如下具体信息: Apr 12 00:36:04 mylinux sendmail[4685]: ...

  4. spring filter过滤器

    1.简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ...

  5. phpStydy配置memcache扩展

    一.下载并安装memcached服务器端软件    1.下载memcached软件 32位下载地址: memcached-win32-1.4.4-14.zip(直接下载),memcached-win3 ...

  6. 【转载】关于Alipay支付宝接口(Java版)

    转载自:http://blog.163.com/lai_chao/blog/static/70340789201412724619514/ 1.alipay 双功能支付简介 2.alipay 提交支付 ...

  7. W3School-CSS 边框(border)实例

    CSS 边框(border)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边 ...

  8. iOS极光推送,两次Bundleid不一致( 开发证书没有通过验证 是否重新上传证书)的解决方案

    极光在配置ios端推送时,需要上传p12证书,如果遇到如下图:: 证书上传未通过的原因一般有: 1.当前上传的p12证书密码输入有误: 2. 证书导出的时候展开了证书,把个人私钥导了出来,导证书的时候 ...

  9. android 设置布局横屏竖屏

    只要在AndroidManifest.xml里面配置一下就可以了.在AndroidManifest.xml的activity(需要禁止转向的activity)配置中加入android:screenOr ...

  10. emacs 新手笔记(三) —— 为 emacs 做一点简单的定制

    ilocker:关注 Android 安全(新入行,0基础) QQ: 2597294287 在 emacs 启动时,会加载 ~/.emacs 文件.在该文件中编辑一些 lisp 代码,是一种最为简单的 ...