c/c++概念辨析-指针常量&常量指针、指针函数&函数指针、指针数组&数组指针

概念澄清: 

统一规则:

        不管是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 
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/c++概念辨析-指针常量&常量指针、指针函数&函数指针、指针数组&数组指针_第1张图片

以下是一个C++数组指针指向二维数组的例子:

#include 
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

你可能感兴趣的:(c++,数据结构,开发语言)