1、修饰指针变量的几种情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // 0、正常指针,可以给p赋值,也可以给*p赋值 int *p = &a; // 1、const修饰*p,可以给p赋值,不可能给*p赋值 int const *p = &a; const int *p = &a; const与int位置互换是等价的 p = &b; *p = 20;// 编译报错 // 2、const修饰p,不可以给p赋值,可以给*p赋值 int * const p = &a; p = &b; // 编译报错 *p = 20; // 3、const修饰*p, const修饰p,p与*p都不可以赋值 int const * const p = &a; const int * const p = &a;//与上一行等价 p = &b; // 报错 *p = 20; // 报错 |
2、修饰不同类型的引用
1 2 3 4 5 6 7 8 9 | long a = 10; // 不同类型的引用,编译不通过 // int &r = a; // 加const修饰,编译通过 int const &r = a; // const修饰的引用,被当做常量保存 a = 20; // 修改原值后,r的值不变,还是引用时的值,r输出为10 cout << r << endl; |
3、修饰数组的引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | // 定义数组变量 int array[] = { 1, 2, 3, 4 }; // 不加括号则表示指针数组,而非指向数组的指针 int (*p_array)[4] = &array; // 类似指针,不加括号则表示为引用数组,而非数组引用 int (&r_array)[4] = array; // 引用与指针都要表明指向或引用的数组长度,不灵活 // 数组本身可以用指针来表示 int *p = array; // 指针的引用则很好表示,这样一来rp则表示数组的引用 int *&rp = p; // 跳过中间p的转换,直接引用会怎样?因为类型不匹配而报错 // 加const修饰引用,则是被允许的 int * const &rp1 = array; |