C++ Primer ch3 指针和数组

1.
使用数组的时候,编译器一般会把它转换成指针。

2.
auto与decltype在分析数组类型时的区别:

int a[] = { 1,2,3 };
auto b = a; // 得到的是指针类型int (*p)[3]
decltype(a) c; // 得到的是数组类型int [3]

3.
C++11标准库函数begin()和end()

  • 接受数组作为参数
  • 定义在iterator头文件中
  • end()返回的是不存在的尾后指针
int a[] = { 1,2,3 };
int *pB = begin(a);
int *pE = end(a);
// 利用begin和end遍历数组
for (auto p = pB; p != pE; ++p) {
    cout << *p << ' ';
}

4.
指针相减得到的结果类型是名为ptrdiff_t的标准库类型。

5.
存在数组 int a[] = {1 , 2 , 3 , 4 , 5};
当你使用下标对数组元素进行随机访问的时候(比如访问a[2]),其实进行的是这样的操作:

int *p = a;
int val = *(p + 2);

以此得出,只要指针指向的是数组中的元素,都可以执行下标运算:

int a[] = { 1,2,3,4,5 };
int *p = &a[2];
int j = p[1];   // j为a[2+1]
int k = p[-2];  // k为a[2-2]

6.
C++标准库与旧代码的接口

// c_str()函数:将string类转换为C风格的字符串
string s = "Hello World!";
const char *s_elder = s.c_str();
//将内置数组的内容复制到vector
int a[] = { 0,1,2,3,4,5 };
vector<int> v(begin(a), end(a));

7.
关于多维数组

int a[3][4];
int(&row)[4] = a[1];// 将row绑定到a的第二个4元素数组上

row是行,col是列

使用C++ 11范围for语句处理多维数组

int a[3][4];
int ct = 1;
for (auto &row : a) {
    for (auto &col : row) {
        col = ct++;
    }
}

注意,无论是否进行读写操作,必须将外层循环的控制变量声明成引用类型,这是避免数组被自动转换为指针
假如循环写成如下格式:

for(auto row : a)
    for(auto col : row){}

摘自C++ Primer:

程序将无法通过编译。这是因为,像之前一样的第一个循环遍历a的所有元素,注意元素实际上是大小为4的数组。因为row不是引用类型,所以编译器初始化row时会自动将这些数组形式的元素转换成指向该数组内首元素的指针。这样得到的row的类型就是int * ,显然内层的循环就不合法了,编译器将试图在一个int * 内遍历,这显然和程序的初衷相去甚远。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值