第三天
今天学的东西有点乱,但是和C基本上依旧一模一样,但是这一遍看完以后对指针和引用的理解较之以前不大一样了,应该说是理解地更准确。
1.引用
简单来说,引用就是绑定,&这个符号是有两种意义,在声明里面就是引用,起到变量之间绑定作用,在其他语句中,意思就是取地址,和基本运算符差别不大,更改其中一个值。另一个值也会发生改变,这里注意,如果使用引用,在声明的时候一定要绑定一个变量,不可以是常量,也不能只定义
#include <iostream>
int main(int argc, char** argv) {
int org1 = 10;
std::cout << "now org1 is " << org1 <<std::endl;
int &org = org1; //org与org1绑定
std::cout << "now the org1 is " << org1 << " and org is " << org <<std::endl;
org = 20;
std::cout << "now the org1 is " << org1 << " and org is " << org <<std::endl;
return 0;
}
}
now org1 is 10 now the org1 is 10 and org is 10 now the org1 is 20 and org is 20 另一种用法是取地址,后面指针再写
2.指针
指针,就是指向某一块地方,指针存放某个对象的地址
int org1 = 10, *org = &org1;
std::cout << "now *org is " << *org <<std::endl;
now org is 10 因为org此时是存放的变量org1的地址,*符号在声明的时候是定义一个指针,在作为运算符使用时的意思是解,即查看该地址存放的变量的值。&符号是取得变量org1的地址。
注意:*org不是存放的地址,org才是存放的地址 *只是告知这条是声明,在这里不做解的意思
下面是复合类型,复杂一点的
int org1 = 10, *org = &org1;
int *&org2 = org; //属于是将org2作为一个引用,org和org2绑定在一起了,地址一起改变 ,如果有一个指向的值发生变化,二者都将变化
std::cout << "now *org2 is " << *org2 <<std::endl;
now *org2 is 10
int i =42;
int *p;
int *&r = p;
r = &i; //这里改变了r的地址
std::cout <<"now *r is " << *r << " and *p is" << *p <<std::endl;
*r = 0; //r的地址和i的一样,r和p为绑定的
std::cout <<"now *r is " << *r << " and *p is " << *p <<std::endl;
now *r is 42 and *p is42 now *r is 0 and *p is 0
这边是直接使用的书上的例子,一开始没弄清楚一些东西,现在大概明白了,上面那块实我自己写的,本来想通过改变地址来改变指向的值,但是一直报错,应该是不能直接进行地址的代换了,不能使用一般的赋值形式 再加一个例子
int org1 = 1024;
int *org2 = &org1;
int **org3 = &org2;
解释一下,org2是存放的org1的数值的地址,可以说是org2指向org1,下面的**org3可以理解为是指针org3的解是存放的org2的地址,所以可以说是org3指向org2,org2指向org1,所以三者的值应该都为1024
注意使用的时候从右往左去理解复合类型的定义
3.const限定符
const限定符就是定义了不能再变了,没什么很特殊的地方,注意一点,const定义变量时候一定要初始化,只单单定义会报错 例如
const int a = 3;
再改变a的值就会报错,无论是赋值还是其他形式 还有一点比较重要的
extern const int a = 3;
默认状态下,只是在本文件里可以使用,上述不只是在本文件里可以使用,在其他文件里变量值还是不变的
int i =42;
int &r1 = i;
const int &r2 = i;
std::cout <<"now r1 is " << r1 << " and r2 is" << r2 <<std::endl;
r1 = 0;
std::cout <<"now r1 is " << r1 << " and r2 is " << r2 <<std::endl;
i = 20;
std::cout <<"now i is " << i << " and r2 is " << r2 <<std::endl;
now r1 is 42 and r2 is42 now r1 is 0 and r2 is 0 now i is 20 and r2 is 20 简单来说,虽然const定义r2,将r2与其他变量绑定,不能通过直接改变r2的值,但是可以通过i或者是与i绑定的其他变量去改变r2的值。 const定义的指针只能指向const定义的变量
const double pi = 3.14;
const double *p = π
指向常量的指针不可以用来改变常量的值,但是没有规定那个对象的值不能通过其他途径改变。 下面代码不打了,基本理解就行,也不是很复杂。
double *const curErr = &k
const double *curErr = &k
1.指针在const前,意思为该指针将永远指向地址k 2.指针在const后,意思为该指针为指向常量的指针
总结一下 如果说是指向常量的指针,那么他的地址和所指向的值不能发生改变,假如说指针所存地址不变,但是他的指向是一个可变常数,那么就可以改变该数的值,同(1)。
针对于const对指针的定义不同,就引出了两种。
顶层const,表示指针本身是一个常量,地址不变。
底层const,表示指针所指对象是一个常量。
更一般的,对于任何的数据类型,表示任意的对象是常量的,都是顶层const。 举例:
const int *const p3 = p2; //靠又的明显是地址不变,是顶层const,左边用作声明,是底层const
const int ci =42; //对于表示的对象是常量,是顶层const,没有指针,用一般判断
const int *p2 = &ci; //p2的值允许被改变,用作声明,是底层const
总结一下,今天的东西看的有点杂,不是很喜欢这些东西,后面希望应用多一点了吧
md下午安装VScode配置c++环境,搞了半下午,没弄好,还是回来用c++,VScode的界面看着确实舒服,美工做的特别好,等有空了再弄吧
今日份结束
|