C++Primer再读读书笔记:第四章

一、数组


       数组是有类型名、标识符和维数组成的复合数据类型,类型名规定了存放在数组中的元素类型,维数则指定数组中包含的元素个数。
      1、数组的长度是固定的,与vector类型不同,数组不提供push_back或者其他的操作在数组中添加新元素。如果必须添加新元素,程序员必须自己管理内存,重新分配一个新的内存空间更大的数组,复制所有元素到新的数组

      2、数组元素也是从0开始计数,vector中使用vector::size_type作为下标类型,在数组中下标的正确类型是size_t。
const size_t array_size = 10;
intg ia[array_size];
for(size_t ix=0; ix != array_size; ++ix)
     ia[ix] = ix;
       3、导致安全问题的最常见原因是所谓的“缓存区溢出(buffer overflow)”错误,当没有检测下标引用了越出数组或者其他类似数据结构边界时容易出现这个错误。

二、指针


       指针是指向,某种类型对象的符合数据类型,是用于数组的迭代器,指向数组中的一个元素。
       1、指针是什么:指针就是用于指向对象,保存的是另一个对象的地址。
string s("hello world");
string *sp = &s;
       2、取地址符用户于一个对象上,返回该对象的存储地址,取地址符只能用于左值,只有变量作为左值时才能取地址,

       3、很多运行时错误都源于使用了未初始化的指针。

       4、对指针进行初始化或者赋值只能使用以下四种类型的值:
  • 0值常量表达式
  • 类型匹配的对象的地址
  • 另一个对象之后的下一个地址
  • 同类型的另一个有效指针         
      5、指针操作:
         6、指针和引用的比较

              引用总是指向某个对象,定义引用时没有初始化是错误的;赋值行为的差别,给引用赋值修改的是该引用所管理的对象的值,而并不是使引用与另一个对象关联。引用一经初始化就始终指向这个特定对象。

         7、指向指针的指针

              指针本身也是可用指针指向的内存对象。指针占用内存空间存放其值,隐藏指针的存储地址可存放在指针中;
int ival = 1023;
int *pi = &ival;
int **ppi = π
         8、指针的算术操作
         指针的算术操作只有在原指针和计算出来的新指针都指向同一个数组元素,货指向该数组存储空间的下一单元时才合法,如果指针指向同一对象我们还可以在指针上加1从而获取指向相邻的下一个对象的指针。
 
        9、下标和指针

         在表达式中使用数组名,实际上使用的是指向数组第一个元素的指针。
int ia[] = {0,2,4,6,8};
int i = ia[0];    
          ia[0]是一个使用数组名的表达式,在使用下标访问数组时,实际上是指向数组元素的指针做下标操作。
int *p = &ia[2]; 
int j = p[1];    //p[1] == ia[3]
int k = p[-2]; //p[-2] == ia[0]          
         10、指针和const限定符

三、创建动态数组


       数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道其长度,数组只在定义他的块语句中存在。可以在运行时动态的分配数组。可以在动态确定数组的长度。c语言使用标准库的malloc和free在自由存储区中分配空间,C++使用new和delete实现该功能。
        1、动态数组的定义
int *pia = new int[10]; // array of 10 uninitialized ints
        只需指定类型和数组的长度,创建完成后new将返回指向数组第一个元素的指针。在自由存储区创建的数组是没有名字的,通过间接的访问堆中的对象。

         2、初始化动态分配的数组

         动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数,初始化,如果是内置类型就无初始化。
string *psa = new string[10] ;  // 定义10个空string的数组
int *pia = new[10];    // 定义10个未初始化的int数组
          对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化类别为数组元素提供各不相同的初值。

          3、动态空间的释放
 
         动态分配的内存最后必须进行释放,否则,内存最终将会逐渐耗尽。c++为指针提供deletep[]表达式来释放所指向的数组空间。
delete []pia;  //该语句回收pia所指向的数组,把相印的内存返还给自由存储区。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iot-genius

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值