c++ primer 读书笔记十二

指针运算
给一个指针加上减去某个整数值,结果任然是指针,新元素指向的元素与原来的指针相比前进(后退了)该整数值个位置:

constexpr size_t sz=5;
 int arr[sz]={1,2,3,4,5};
 int  *ip=arr;
 int *ip2=ip+4//ip2指向arr的尾元素arr[4]

给指针加上一个整数,得到的新指针任然需指向同一数组的其他元素,或者指向同一数组的尾元素的下一个

针超出了上述范围就将产生错误,这种错误一般编译器发现不了
和迭代器一样,两个指针相减的结果是它们auto n=end(arr)-begin(arr);到的类型是ptrdiff_t的类型,是一种带符号的
只要两个指针指向同一个元素,或者指向该数组的尾元素的下一个位置,就能利用关系运算符对其比较
可以按照如下方式遍历数组的元素

 int *b=arr,*e=arr+sz;
 while(b<e)
 {
 ++b;
 }

如果两个指针指向不相关的对象
int i=0,sz=42int *p=&i,*e=&sz;
//两个无关毫无意义
while(p<e)

使用数组初始化vector对象
不允许使用一个数组为另外一个内置类型的数组赋值,也不允许使用vector对象初始化数组,相反的,允许使用数组来初始化vector对象。要实现这一目的,只需指明拷贝区域的首元素地址和尾后地址就可以了:

    int int_arr[]={0,1,2,3,4,5,6}
    vector<int>ivec(begin(int_arr),end(int_arr));//初始化数组
用于初始化vector对象的值也可能仅仅是数组的一部分:L
vector<int>subVec(int_arr+1,int_arr+4);
//拷贝三个元素:int_arr[1],int_arr[2],int_arr[3]

3.6多维数组
严格来说,c++语音没有多维数组,是数组的数组:

当一个数组的元素仍然为数组时,用两个维度来定义它:一个维度表示数组本身大小,另外一个维度表示其元素大小:

int ia[3][4];//大小为3的数组,每个元素包含有4个整数的数组

int arr[10][20][30]={0};
//理解这个是,首先arr是一个大小为10的数组,每个元素的数组又都是含有30个整数的数组

多维数组的初始化
允许使用花括号括起来的一组值初始化多维数组,这点和普通的数组一样

int ia[3][4]={
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
与下面的代码是等价的
int ia[3][4]={0,1,2,3,4,5,6,7,8,9,10,11}
每一行一个元素
int ia[3][4]={{0},{4},{8}};

//显示地初始化第1行,其他元素执行值初始化
int ix[3][4]={0,2,6,9}
初始化的第一行的4个元素,其他元素初始化为0

多维数组的下标引用
可以使用下标运算符来访问多维数组的元素
如果表达式含有下标运算符数量和数组维数一样多,该表达式的结果将是给定类型的元素:反之,如果表达式含有的下标运算符数量比数组维数小,

p114 没看懂

指针和多维数组
当程序使用多维数组的名字时,也会自动将其转换成指向数组收元素的指针。
因为多维数组实际上是数组的数组,所以由多维数组名转换来的指针实际上是指向第一个内层数组的指针:

int ia[3][4];//大小为3的数组,每个元素是含有4个整数的数组
int(*p)[4]=ia;
p=&ia[2];

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值