一:指针部分
指针是一种变量类型,声明指针变量需要分配独立的存储空间,指针可以为空『void』表示不指向任何对象。
指针里存储的值是一个地址,可以通过这个地址获取和改变所存储变量的值。
指针的类型必须与其所指向变量的类型一致,可以在任何时候改变指向的变量……
————————————————————这些是简单理论的啰嗦,下面说些代码相关的————————————————————————————
定义方式:int *p = &a; *是指针的标识符,表示p是一个指针类型的变量,这里的变量a,必须是一个int类型。 &运算符可以获取变量的地址
取值方式:(可能有点绕)通过指针获取所指向变量的值是这样做的:*p
int a = 10; int *pa = &a; cout<<a<<"----"<<*pa<<"----"<<&a<<"----"<<pa<<endl;
输出结果:10----10----0x7fff5fbff89c----0x7fff5fbff89c
可以看到通过*pa获取的值跟a的值一样,a的地址和pa的值也一直,说明指针类型的变量pa的值就是a的地址。
关于指针呢,还有很多东西可以讲,比如指针运算、指向指针的指针、指针方法的指针、指针作为函数参数等等,下次针对指针专门来写写看
二:引用部分
有JAVA或C#等语言基础的人对于引用的认识估计和指针没什么区别,在C++里这两者区别甚大,这也是我学习C++到目前为止跟之前知识体系差距最大的一点。
C++中引用其实就是给变量起一个别名,引用没有自己独立的存储空间,与它引用的变量共享能存,对引用的操作就是对变量的操作(真假美猴王)。
定义方式 int &f = a; &这里又是引用的标识符,f是一个对变量a的引用。f的类型是int那么a的类型也必须是int。
int a = 10; int &fa = a; cout<<a<<"----"<<fa<<"----"<<&a<<"----"<<&fa<<endl;
输出结果:10----10----0x7fff5fbff89c----0x7fff5fbff89c
可以看到引用fa的值和地址与变量a的值和地址一致。
三:引用的使用注意
引用必须在定义的时候就进行初始化。下面的是错误写法:
int ⁡
引用一旦在定义的时候确定好引用哪个变量,以后都不能再引用其他变量
int a = 10;
int &af = a;
int b = 20;
af = b;
最后一行代码af = b;并不代表af引用了变量b,而是将变量b的值赋值给了af引用,也就是将变量b的值给了a
四:const 与 引用
下面的代码效果:不能通过af引用修改变量a的值。称af为const引用
int a = 10;
const int &af = a;
下面的代码是不能编译通过的。因为ref引用的类型和变量d的类型不匹配
double d = 1.78;
int &ref = d;
但是将ref改为const引用,就能编译通过
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