指针、引用、引用和函数参数、引用和const、const 和 #define、#define的特殊用途
一、const
int a = 10;
int * const p = &a;
int a = 10;
const int *p = &a;
void test(const int * a);
int age = 10;
test(&age);
int a = 10;
const int * const p = &a;
二、const习题
typedef char * pStr;
char string[4] = "bbc";
const char *p1 = string;
const pStr p2 = string;
p1++;
p2++;
3)判断最后2句代码是否合理
int x = 1;
int y = 2;
const int* px = &x;
px = &y;
*px = 3;
3.2 指针指向的变量的值可以改变,指向不可变
int x = 1;
int y = 2;
int* const px = &x;
px = &y;
*px = 3;
3.3指针指向的变量的值不可变,指向不可变
int x = 1;
int y = 2;
const int* const px = &x;
px = &y;
*px = 3;
三、const 和 #define
#define PI1 3.14159 // 常量宏
const double PI2 = 3.14159; // 此时并未将Pi放入RAM中
double a = PI2; // 此时为PI2分配内存,以后不再分配!
double b = PI1; // 编译期间进行宏替换,分配内存
double c = PI2; // 没有内存分配
double d = PI1; // 再进行宏替换,又一次分配内存!
四、#define的副作用
// MAX宏返回两个数值中的最大值
#define MAX(x, y) ((x) > (y) ? (x) : (y))
int a = 10;
int b = 6;
int c = MAX(++a, b);
cout << "c = " << c << ", a = " << a << endl;
这时候的输出结果是:c = 12, a = 12
如果将变量b的初值改为15,也就是int b = 15;
这时候的输出结果是:c = 15, a = 11
五、#define的特殊用途
#define TO_STR(x) #x
cout << TO_STR(abcd) << endl;
#define CONCAT(x, y) x##y
int myage = 20;
cout << CONCAT(my, age) << endl;
六、引用
int a = 10;
// 引用必须在定义的时候就进行初始化
int &af = a;
// 引用af 和 变量a 的内存地址一致
cout << &af << ", " << &a << endl;
// 变量a的值被改为了20
af = 20;
cout << af << ", " << a << endl;
程序的输出结果是:
0x7fff5fbff89c, 0x7fff5fbff89c
20, 20
八、下面的例子表示bf、af同时引用着变量a
int a = 10;
int &af = a;
int &bf = af;
cout << &bf << ", " << &af << ", " << &a;
打印出来的内存地址是一致的
九、引用的使用注意
int ⁡
int a = 10;
int &af = a;
int b = 20;
af = b;
最后一行代码af = b;并不代表af引用了变量b,而是将变量b的值赋值给了af引用,也就是将变量b的值给了a
十、const 与 引用
int a = 10;
const int &af = a;
double d = 1.78;
int &ref = d;
double d = 1.78;
const int &ref = d;
编译能通过的原因是const int &ref = d;等价于下面2句:
int temp = d;
const int &ref = temp;
也就是说ref引用 跟 变量d 并不共享同一块存储空间
十一、引用 与 函数参数
int ages[] = {20, 15, 36, 17, 28};
int & ages_index(int i)
{
return ages[i];
}
// 相当于ages[0] = 30;
ages_index(0) = 30;
十三、引用 与 函数返回值
int & add(int a, int b)
{
int sum = a + b;
return sum;
}
int n = add(10, 20);
int &nf = add(10, 10);
cout << "n = " << n << endl;
cout << "nf = " << nf << endl;
上面的程序会造成nf引用的值是不确定的,并不是20
十四、引用 与 指针 的区别