> 这篇文章其实在 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++ 特有的万物皆可指针起手
正文
引
这是依托……啥?
这玩意能编译运行,不信你试。
根据警告信息
[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)是一个万能指针。
> 欲知后事如何,请听下回分解(后边讲了)。
地址
要获取一个变量的地址,可以使用&<变量>的格式。
要从一个地址/指针获取其指向的值,使用*<指针>。
如:
这就是指针的基本使用方法。
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就是一个指针。
> 实际上a还是一个常量,所以请停下你拿数组开头遍历数组的想法。
> 如果你真的想,新建一个指针p,执行p=a,然后使用p遍历。
当然,将数组名直接当作指针来运算这样的操作在OI中非常常见……
你写过这个吧。:)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CHAPTER 4 - 指向指针的指针
> 指向指向指针的指针的指针
> 指向指向指向指针的指针的指针的指针
> 指向指向指向指向指针的指针的指针的指针的指针
> ……
如果要声明一个指向指针的指针(假设q指向int* p),那么要这样定义:
然后如果要读取p指向的内容,就需要……
这样。
当然这个堆叠是无限的,所以如果你想要……
也行。(此程序由另一个程序生成。)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CHAPTER 5 - 函数指针
在C++中,函数指针用于存储函数的入口地址,从而间接调用函数。
定义方式:
啊当然我们不要这样黑奴,C++11起就可以使用auto自动推断类型了。
那么这玩意有啥用呢?答曰:像sort里的cmp一样传递规则函数。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
后记
晚上8:30突然想起来填坑。实际上填了坨大的,有时间再回来夯土。
2026/3/2 22:57 于 广东 深圳