C++学习笔记二——常量指针、指针常量和函数指针

时间:2022-12-25 22:24:25

1、常量指针与指针常量

常量指针(const type *):指向固定地址的指针。

指针常量(type * const type):指向常量的指针, 可以修改指向,但不可以修改所指向的地址里面的值。

区别如下图:

C++学习笔记二——常量指针、指针常量和函数指针

<span style="white-space:pre"></span>int group = 1;
int chips = 2;
const int * p_s = &group;
//*p_s = 3; //有误,常量不允许修改
p_s = &chips;

int * const p = &group;
*p = 3;
//p = &chips; //有误,常量不允许修改


2、函数指针调用函数

       /*函数指针调用函数*/
double x, y, z;
double pam(int);
double (*pf)(int);
pf = pam;
//下面三个意思同
x = pam(6);
y = (*pf)(6);
z = pf(6);
C++学习笔记二——常量指针、指针常量和函数指针

函数指针调用函数举例:

#include "stdafx.h"
#include <iostream>

using namespace std;

const double * f1(const double arr[], int);
const double * f2(const double[], int);
const double * f3(const double*, int);

int _tmain(int argc, _TCHAR* argv[])
{
double av[3] = { 123.123, 456.456, 789.789 };
const double *(*p1)(const double*, int) = f1;
auto p2 = f2;
cout << (*p1)(av, 3) << ": " << *(*p1)(av, 3) << endl;
cout << p2(av, 3) << ": " << *p2(av, 3) << endl;

const double *(*pa[3])(const double*, int) = { f1, f2, f3 };
auto pb = pa;
cout << ((pa)[0])(av, 3) << ": "<< *(((pa)[0])(av, 3)) << endl;

for (short i = 0; i < 3; i++)
{
cout << ((pa)[i])(av, 3) << ": " << *(((pa)[i])(av, 3)) << endl;
}

auto pc = &pa;//取pa的地址给pc(这里的pa本身也是数组的地址):也就是说pc存的是数组pa首地址存放处的地址
//即*pc == pa 注意:这里理解好像有误,下面的&pa和pa输出相同。。。很难理解——数组名本身是个地址,对地址取地址与其本身值相同?!? 以后补充
cout << "pa的地址: " << &pa << endl;cout << "数组pa的首地址:" << pa << endl;cout << "数组pa的首地址存放处的地址:" << &pc << endl;cout << (*pc)[0] << ": " << *((*pc)[0](av, 3)) << endl;return 0;}const double * f1(const double *arr, int n){return arr;}const double * f2(const double arr[], int n){return arr + 1;}const double * f3(const double arr[], int n){return arr + 2;}

——2016.11.9