C++ Primer学习笔记(二)

第四章
1.使用声明语句创建数组: typename name[size];size必须是在编译时已知的,即不能是变量:变量的值实在运行的时候设置的。如果不初始化数组,那么数组中的值时不确定的。int total[500]={1}:第一个初始化位1,其余为0;
2.sizeof() 用于数组名返回数组的字节数,用于元素返回元素的字节数。
3.字符串:字符串可以存储在字符数组中,前提是数组最后的一个字符是‘\0’
4.在数组中使用字符串: char name1[size]=“c++cowBoy”; size不小于strlen(字符串)+1;strlen()只计算字符串可见的长度,末位还有’\0’;
5.通过字符数组输入字符串:cin当遇到空格时,确定字符串的结束位置。例如,输入: BiPeng FJNU,会被分为两个字符串,分别读取。
6.每次读取一行字符串:
(1)getline():
cin.getline(name,size);
用户输入的字符串长度应该不大于size-1,因为剩下的空间用于储存结尾的空字符。
(2)get():
get()和getline()接收的参数相同,和getline()不同的是,get()不再读取并舍弃换行符而是将其留在输入队列中。

cin.get(str1,size);
cin.get(str1,size);
经过上述操作str2的第一个字符会是回车符。所以需要在两句中间再加一个get()。
即:
cin.get(str1,size);
cin.get();
cin.get(str1,size);
或者:
cin,get(str1,size).get();
cin.get(str1,size);
同样的道理:cin.get(…).get(…)和连续调用两次cin.get()效果相同。

使用get()之前要检查输入队列中是否已经有回车符,如果有输入的将是空行。

7.ACII系统上’S’是83的另一种写法,而"S"表示字符串所在的内存地址.

8.当数据项使用两种或者更多中格式但不会同时使用时,用共用体union

9.枚举值如果没有显式定义,那么第一个默认为0,其他的为前面一个+1

10.枚举取值范围:上限大于这个枚举的最大值的最小的2的幂-1;下限:这个枚举最小值>0那么取值范围最小为0,如果最小值<0,那么取值范围最小为不大于最小值的2的幂(负)+1

11.声明和初始化指针:int ducks; int *birddog=&ducks 实际上是创建birddog变量,将ducks的地址存入其中

12.一定要在对指针应用接触引用运算符*之前,将指针初始化一个确定的适当的地址.

13.只能用delete来释放new分配的内存.对空指针使用delete是安全的

14.用new动态创建数组:int *psome=new int [10] 使用完后要用delete释放内存 delete [] psome;访问第i+1个元素,使用psome[i].

15.不是new分配的内存不能用delete释放;不要用delete释放同一块内存两次;如果用new来分配内存,应该使用delete来释放;只new不delete会造成内存的泄漏;对空指针delete是安全的。

16.c++将数组名解释为数组第一个元素的地址.
double wages[3]={1,1,1}
double * pw=wages
wages=&wages[0]表示数组第一个元素的地址

17.sizeof(): 应用于数组表示的是数组的长度(字节数),应用于指针表示指针的长度(字节数).

18.tacos[2] means (*tacos+2)

19.如果指针类型为 char* 那么cout显示其指向的字符串.如果要显示地址,需要将这个指针强制转换为别的类型的指针(如 int* )

20.使用strcpy(a,b)时,如果b比a的最大长度大,那么b剩余的字节会覆盖到数组a的后面的内存,可能会覆盖程序正在使用的其他内存。
此时应该使用 strncpy(a,b,strlen(a)-1),然后把a[length-1]赋值为’\0’

21.short tell[10] tell:数组名被解释为第一个元素的地址,&tell[0]同上;&tell被解释为这个数组的指针.

22.如果给cout提供一个字符的地址,则从该地址开始打印,直到遇到空字符. 在绝大多数c++表达式中,char数组名,char指针和引号括起来的字符串都被解释为字符串的第一个字符的地址.

23.将字符放到数组时,初始化数组时要使用 = 运算符,否则应该使用strcpy()或strncpy()

24.管理内存的方式:自动储存,静态储存,动态储存,(线程储存(c++11 新增))

(1)自动储存:函数内部定义的常规变量使用自动存储空间.所属函数被调用时,自动产生,函数结束时消亡,即内存被释放.
自动变量通常储存在栈中

(2)静态储存:整个程序执行期间都存在的存储方式.让变量成为静态的两种方式:在函数外定义它;声明变量时使用static

(3)动态储存:new和delete;它们管理了一个内存池,被称为自有储存空间或者,是和自动变量和静态变量所用的内存分开的.
new和delete可以让数据的生命周期不完全受程序或者函数的生存空间控制.相比使用常规变量可以让程序员对内存拥有更大的控制权.然而,在栈中,自动添加和自动删除使得内存总是连续的,而new和delete可能导致堆的内存不连续,使得追踪新分配内存的位置变得更难.

25.数组和array结构的长度是固定的,储存在栈中,vector长度是动态的,储存在堆中.可以将一个array对象赋值给另一个对象,数组必须一一赋值.

26.c++不会检查数组的超界错误,比如a[-2]:找到a指向的地址,向前移两个元素.而对于vector和arry,使用a.at(i)可在运行期间捕获非法索引.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值