概念澄清:
统一规则:
不管是XX指针,还是指针XX,后者是本体,前者只是个定语,前者也可以替换为其他同类(例如字符串),帮助理解。
XX指针:
可简单理解为,XX类型的指针,也可理解为指向XX的指针。
常量指针:指向常量内容的指针;
数组指针:指向数组的指针。
函数指针:指向函数的指针。
指针XX:
后者是本体,是侧重点。
指针常量:指针本身是个常量,(类比 字符串常量);
指针数组:指针本身作为数组元素,(类比 字符串数组);
指针函数:一个返回值是指针的函数。【吐槽:发明这个概念感觉挺多余的,给人制造混淆】
实战:
常量指针与指针常量
记忆:
忽略int,看const右侧紧跟着的是指针p还是常内容 *p, 是指针,那就侧重点在描述指针值不可变,可类比 “字符串常量”,即为 指针常量;是常内容*p,那就是侧重点描述指向内存内容不可变,记忆时可以把*p 替换为常内容,那就是常量(内容)指针)
练习:
int const* p; //const修饰的是*p,常量指针;
const int* p; //const修饰的是*p,常量指针;
int* const p; //const修饰的是p,指针常量;
函数指针与指针函数
函数指针:一个指向函数的指针。
这种指针的定义方法为:返回类型 (*指针变量名)(参数列表)。
ret (*p)(args, ...);
这种指针的初始化方法很简单,为:
函数指针变量 = 函数名;
下面是一个简单的例子:
#include <iostream> using namespace std; int add(int a, int b) { return a + b; } int main() { int (*p)(int, int); // 定义函数指针 p = add; // 指向函数 int sum = (*p)(1, 2); // 调用函数 cout << sum << endl; // 输出:3 return 0; }
在上面的例子中,我们定义了一个函数指针p,它指向一个参数为两个int类型的函数,并返回一个int类型的值。然后我们将它指向了add函数,并通过*p调用了add函数,将1和2作为参数传递给了add函数,最后输出了add函数的返回值3。
指针函数:一个返回值是指针的函数(举例忽略)。
指针数组与数组指针
指针数组:以指针为元素的数组(本体)
定义格式:
数据类型 *首地址[];
如下,是一个 以 int型指针为元素的数组
int *arry[10];
数组指针:指向数组的指针(本体)
数组指针是指向数组的指针,它可以像数组名一样访问数组元素。在C/C++中,数组指针的定义方式为:指针变量名加上一对圆括号,再加上数组名。
例如:
int (*p)[n];是数组指针,它指向二维数组中的时候,n为每个一维数组的长度,即列宽。
数组指针指向一维数组例子:
int arr[5] = {1, 2, 3, 4, 5}; int(*p)[5] = &arr;
数组指针指向二维数组例子:
数组指针又称为行指针,它指向的是一个数组,对于一个二维数组,它指向的就是一行行一维数组。这个指针p在指向一个二维数组的时候,每P+1就跳过 一维行数组的长度 直接指向下一行。
以下是一个C++数组指针指向二维数组的例子:
#include <iostream> using namespace std; int main() { int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}; int (*p)[4] = arr; for(int i=0; i<3; i++) { for(int j=0; j<4; j++) { cout << p[i][j] << " "; // 通过指针访问二维数组元素 } cout << endl; } return 0; }
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12