原谅一个菜鸡把这些概念整理到一起,目的是为了加深下印象,同时也和大家一起分享,写的有误的地方还请大家多多包涵和指正。大概从接触c语言指针开始一直到学习c++的过程中,这些概念我始终都很难以彻底搞明白,总是当初记得,然后过几天就忘记了。之后再次见到这些代码时就完全搞不清楚了。
1、函数指针
指向函数的指针(没错,我就是这样记的)。函数指针本质上是一个指针,不过这个指针是指向函数的,既然指针可以指向变量,那么指向函数也不足为奇了。
Code
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
int n, m, T;
int Max(int x, int y){
if(x < y) return y;
return x;
}
int main(){
int i, j, k;
int (*p)(int, int); //函数指针的声明
p = Max; //指定该函数指针指向哪个函数
cin >> n >> m;
cout << p(n, m) << endl;
return 0;
}
Result
23 45
45
2、指针函数
返回指针的函数(没错,就是这么巧)。指针函数本质上是一个函数,不过这个函数返回的是一个指针,函数可以无返回值,也可以返回一个int型的数据,那么为什么不可以返回一个指针呢!这样就很好理解了。
Code
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
#include<stack>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
int n, m, T;
int result;
int *Max(int x, int y){
if(x < y) result = y;
else result = x;
return &result;
}
int main(){
int i, j, k;
cin >> n >> m;
int *p = Max(n, m); //既然返回指针,那必定需要用一个指针去接收这个结果
cout << *p << endl; //输出这个结果
return 0;
}
3、常量指针
指向常量的指针。常量指针表示的是指向的对象是一个常量,即不允许通过指针修改它的值,但是指针本身不是一个常量,它可以指向其它的变量。
Code
int main(){
int i = 1, j = 2, k = 3;
const int* p = &i;
*p = 10; //不允许,因为指针指向的对象为一个常量
p = &j; //允许,此时指针指向了变量j
return 0;
}
4、指针常量
指针本身是一个常量。和常量指针相反,指针常量表示的是指针本身是一个常量,即指针的地址不能修改,在声明指针时对其进行了初始化之后,因为指针本身是一个常量,那么以后就不能将此指针指向其它的变量。
Code
int main(){
int i = 1, j = 2, k = 3;
int* const p = &i;
*p = 10; //允许,修改了指针指向对象的值
p = &j; //不允许,指针本身是一个常量,不再允许指向其它的变量
return 0;
}
5、常量指针常量
指向常量的指针常量。常量指针常量指的是指针本身和它指向的对象都是常量(这么多常量组成的概念,就一股脑的认为所有的都是常量吧)。
Code
int main(){
int i = 1, j = 2, k = 3;
const int* const p = &i;
*p = 10; //不允许
p = &j; //不允许
return 0;
}
6、常量引用
指向常量的引用。指针常量在定义上和常量指针十分相似,即引用指向的对象是一个常量,不允许通过引用修改它的值。
Code
int main(){
int i = 1, j = 2, k = 3;
const int &q = i;
q = 10; //不允许,因为引用指向的对象是一个常量
return 0;
}
7、引用常量
实际上是不存在这一说法的,因为引用本身就是一个常量,引用代表的是变量的一个别名,在初始化时为其指定了一个指向的对象,以后是不能让其指向其它变量的,这里不同于指针。
int main(){
int i = 1, j = 2, k = 3;
int &q = i;
&q = k; //不允许,引用只能指向初始化时指定的对象,不能指向其它的变量
return 0;
}