#创作计划#论指针
2026-03-02 22:56:37
发布于:广东
这篇文章其实在 2025-11-15 就开坑了,但是直到2026-3-2我才来填坑。
参考文献:C Primer Plus (人民邮电出版社,978-7-115-52163-7) , C++ Primer Plus (人民邮电出版社,978-7-115-52164-4)
参考了 CSDN 与 https://runoob.com
阅读前须知:
<xxx>表示这个内容(包括尖括号)应被上下文中指定的具体内容替换。
前言
是的这个玩意是我在课上想出来的,回家再码字。
C/C++ 特有的万物皆可指针起手
正文
引
这是依托……啥?
#include<bits/stdc++.h>
using namespace std;
void f(){
cout << 1234;
}
void f2(){
cout << "114514";
}
int main(){
cout << *f[3] << ' ' << *f2[3];
}
这玩意能编译运行,不信你试。
根据警告信息
[Warning] pointer to a function used in arithmetic [-Wpointer-arith]
原本的警告信息很长,这里砍掉了行列和文件且只放了一个(
*f[3]和*f2[3]分别有一个警告)。
可以发现这里的f和f2是一个"pointer to a function"翻译过来就是指向函数的指针,但是为什么呢?
这个坑我们留到后面再填。(不讲基础你学个啥)
Chapter 1 - 指针基础:什么是指针
指针提供一种以符号形式使用地址的方法。
指针是一个变量,其存储一个地址。
使用<类型>* <名称>格式可以定义一个指针。星号位置不影响运行
特别的,类型为
void的指针(如void* p)是一个万能指针。
欲知后事如何,请听下回分解(后边讲了)。
地址
要获取一个变量的地址,可以使用&<变量>的格式。
要从一个地址/指针获取其指向的值,使用*<指针>。
如:
int var=20;
int* p=&var; //p存储了var的地址
cout << p << endl; //输出如:0x1F9451DA(十六进制)
cout << *p << endl; //输出:20
这就是指针的基本使用方法。
Chapter 1.1 - 空指针
空指针在C++中有多种用法。
一般来说,可以通过int* p = NULL这样的方式来定义一个空指针。当输出此指针时输出0。
在大多数系统上,访问地址0是不被允许的。空指针有一个特殊含义,表示该指针不指向有效位置。
Chapter 2 - 指针的算数运算
指针其实是一个整型,因此可以执行四则运算。
假设有指针int* p,指向地址1000,指向的地址的值为20。
注:假设此处的编译器使
int占用4个字节。由于标准中没有明确规定,int也可以占用2字节或8字节。
如果执行p++,p会变成:
A.1001
B.1004
C.114514
答案:B。
在对指针与整数进行加减运算时,会根据指针指向数据占用的字节数决定增减的字节数。
如果将两个指针进行减法运算,会得到这两个指针相隔的元素数。这似乎可以以一种极其神经的方法统计列表元素个数……
如果p指向一个char类型变量,则p++后p=1001,因为char占用1字节。
对于长整型
__int128,其确实移动了16字节,看来这代码极其通用啊。(TDM-GCC 4.9.2 64-Bit,标准为C++14)
同样的,指针也可以进行比较(!=,==,<,>,<=,>=)。
Chapter 3 - 指针和数组
指针和数组有着极其密切的关系。实际上,如果有数组a[],那么a就是一个指针。
int a[5] = {1,2,3,4,5};
cout << a; //如:0x1A3B4C5D
cout << *a;//1
实际上
a还是一个常量,所以请停下你拿数组开头遍历数组的想法。
如果你真的想,新建一个指针p,执行p=a,然后使用p遍历。
当然,将数组名直接当作指针来运算这样的操作在OI中非常常见……
int a[6]={1,5,3,1,5,6};
sort(a,a+6);//a[]={1,1,3,5,5,6}
你写过这个吧。:)
Chapter 4 - 指向指针的指针
指向指向指针的指针的指针
指向指向指向指针的指针的指针的指针
指向指向指向指向指针的指针的指针的指针的指针
……
如果要声明一个指向指针的指针(假设q指向int* p),那么要这样定义:
int** q = &p;
然后如果要读取p指向的内容,就需要……
cout << **q;
这样。
当然这个堆叠是无限的,所以如果你想要……
int a = 114514;
int* b = &a;
int** c = &b;
int*** d = &c;
int**** e = &d;
int***** f = &e;
int****** g = &f;
int******* h = &g;
int******** i = &h;
int********* j = &i;
int********** k = &j;
int*********** l = &k;
int************ m = &l;
int************* n = &m;
int************** o = &n;
int*************** p = &o;
int**************** q = &p;
int***************** r = &q;
int****************** s = &r;
int******************* t = &s;
int******************** u = &t;
int********************* v = &u;
int********************** w = &v;
int*********************** x = &w;
int************************ y = &x;
int************************* z = &y;
也行。(此程序由另一个程序生成。)
Chapter 5 - 函数指针
在C++中,函数指针用于存储函数的入口地址,从而间接调用函数。
定义方式:
<返回值类型> (*<变量名>)(<参数列表>);
//如:
int add(int a){return a+1;}
int (*fp)(int) = add;
cout << fp(1);//2
啊当然我们不要这样黑奴,C++11起就可以使用auto自动推断类型了。
那么这玩意有啥用呢?答曰:像sort里的cmp一样传递规则函数。
//假设FuncType代表函数指针类型,返回值 bool ,参数 int 。
bool a(int i){return i>50;}
bool b(int i){return !a(i);}
FuncType p=a,q=b;
bool check(int a,FuncType f){
return f(a);
}
int main(){
cout << check(10,p) << ' ' << check(10,q); // 0 1
}
后记
晚上8:30突然想起来填坑。实际上填了坨大的,有时间再回来夯土。
2026/3/2 22:57 于 广东 深圳
全部评论 5
%%%
2026-03-03 来自 上海
0指针这玩意我都没咋碰过,链表也没写过
2026-03-03 来自 浙江
0正常,C时代的老东西,等我把
shared_ptr这些加一下才算现代货1周前 来自 广东
0
先
顶
再说
2026-03-03 来自 湖北
0emm
2026-03-03 来自 湖北
0渲染后2827字,属于我写的文章中的中等水平。
开头提到的两部大参考书实际上根本没参考。2026-03-02 来自 广东
0其实只参考了 Bing 的AI搜索和菜鸟教程。
2026-03-02 来自 广东
0





























有帮助,赞一个