笔记const
1.常引用
对常引用来说他一般是对由系统临时分配而无法改变的中间变量起别名如以下程序中的两种情况,而引用则是给一般的变量起别名
//引用是给变量起一个别名
#include <iostream>
using namespace std;
int a = 'a';
int main()
{
/*
以下语句在内存中是这样干的char temp(系统在栈中临时分配的) = a;
char &r_a = temp;
*/
char const &r_a = a;
//用(int *)输出存储在栈中r_a的地址
cout << "r_a: "<< r_a << "\n &r_a: " << (int *)&r_a <<endl;
cout << "a: "<< a << "\n &a: " << &a <<endl;
int const &r1_a = a + 1;
//用(int *)输出存储在栈中r_a的地址注意与上面的区别&r_a = a;
cout << "r1_a: "<< r1_a << "\n &r1_a: " << (int *)&r1_a <<endl;
return 0;
}
2.常指针
- 这是指针常量
#include <iostream>
using namespace std;
int main()
{
//指针常量
int a = 10;
int * const p_a = &a;
//p_a = &a; 注意不能在这儿初始化。
cout << "p_a: "<< p_a << ", *p_a: "<< *p_a << endl;
cout << "a: " << a << ", &a: " << &a << endl;
*p_a = 1;
cout << "*p_a: "<< *p_a << endl;
int b = 12;
/*
p_a = &b; 因为这是一个指针常量, 所以不能乱指,但可以改变其所指内存的值,*p_a = 1; ok的
*/
cout<< "p_a: " << p_a << ", *p_a: " << *p_a << endl;
cout<< "b: " << b << ", &b: " << &b << endl;
}
- 这是常量指针
#include <iostream>
using namespace std;
int main()
{
//常量指针
int a = 10;
int const *p_a;
p_a = &a;
cout << "p_a: "<< p_a << ", *p_a: "<< *p_a << endl;
cout << "&a: " << &a << endl;
/*p_a = 1;
注意由于此处是常量指针,故而报错, 所以不能改变所指内存的值,
但可以改变他的指向, 如下:
*/
int b = 12;
p_a = &b; //完全没有问题
cout<< "p_a: " << p_a << ", *p_a: " << *p_a << endl;
cout<< "b: " << b << ", &b: " << &b << endl;
}
总结
int const *p; //常量指针
int *const p = &a; //指针常量得在这儿初始化
其实就是看const修饰谁,修饰*p, *p不能改,为常量指针。修饰p, 为指针常量, p 值不能改。类似的还有函数指针、指针函数、数组指针、指针数组、如下:
int (*p)[3]; //(p先与*结合)为指针变量->指向有三个元素的数组
int *p[3]; //(p先与[]结合)为一个数组:包含着三个指针元素
int (*p)(); //(p先与*结合)为指针变量->指向无参的函数首址
int *p(); //(p先与()结合)为函数名:返回类型为int *