前言
参考了这篇大佬的指针文章,以文章总结我这样一个小白对指针的理解
声明、定义和含义
声明语法格式:变量类型* 名称
int* p; //int类型的指针p
char* a; //char类型的指针a
double* b; //double类型的指针b
定义语法格式:变量类型* 名称 = &其他同类型名称
int a = 2;
int* p = &a;
cout << *p << " " << p;
等价于下面
int a = 2;
int *p;
p = &a;
cout << *p << " " << p;
结果均为:
上面定义的代码可以解释为将变量a的地址赋值给了指针p,为什么呢?
首先要明确定义了指针p后,p表示指针变量,指向的是其他变量的地址;而*p则表示指针变量p所指地址存放的值。这里需要理解计算机程序的原理,我们所写的代码,计算机是需要先找到地址才能找到地址保存的值,所以这样就能够解释指针的本质了。
指针就是通过对变量地址的访问,从而进一步访问到变量值的,所以指针操作效率很高。因为计算机不需要先去找地址再得到变量的值,通过指针可以轻松操作地址,进而操作值
指针与数组
从声明和定义中,我们可以看出指针其实和变量差不多,只不过指针可以很方便地操作地址,比如对于数组
int a[3], * p = a;
a[0] = 5, a[1] = 10, a[2] = 16;
cout << *p << endl;
*p++; //等价于p++
cout << *p << endl;
*p = 7;
cout << *p << " " << a[1] << endl;
结果:
之前说过指针也是一个变量,所以自增运算符也是生效的,而且因为数组是连续的地址,所以*p++的意思是先让指针p移动到下一个地址再取值,也就是指针p一开始指向a[0],之后指向a[1]
结果的两个7也很好理解,因为指针拿到了a[1]的地址,所以可以直接操作值,改变指针的值本质是改变了指针指向的地址对应的值,在这里就是a[1]的值
总结
指针通过对地址的访问,进而访问到地址保存的值,以此来进行各种操作
限于文章的篇幅,对于指针的高级操作,可以参考其他文章