指针的声明 ??ok 在上一节的内容中,我们介绍了,C语言中的指针到底是个什么东西~,指针,包括三个概念:指针类型、指针类型的变量和指针类型的值。今天,我们进一步的讨论指针的其他有趣的case。
?? 我们知道,因为存在指针类型,所以存在着 “指针类型的变量”和 “指针类型的值”。而一般的指针类型的值表示的是“地址”。??实际的应用中,地址一般都是以16进制的整型保存的,那么有个问题来了,既然指针类型的值是int型的(16进制),那为毛还要分“指向int的指针类型”和“指向double的指针类型”啊?有区别吗???
?? 我调研了一下, 从某种角度来看,指针类型和int类型应该是一回事。在C语言的前生——B语言中,指针和整数是没有区别的。但是不同的运行环境会导致int类型和指针类型的长度并不相同。另外,由于Intel8086 是16位的微处理器芯片,存在的功能缺陷限制着,16位的数值分成两组来表示20位的地址。大部分的环境中,指向int的指针类型和指向double的指针类型,还真的没啥区别。。。你敢信?不信也没办法,事实就是这样(都保持相同的表现形式,指向char的指针与指向int的指针内部表示和位数不一样)
另外,除基本的类型,还有一种可以“指向任何类型的指针类型”——void *类型
# include
using namespace std;
int main(int argc, char const *argv[])
{
int demo = 5;
void *p_tmp;
p_tmp = & demo;
//这不会出错
cout <<*p_tmp<
也许就会有朋友说了,尼玛,有个万能的指针类型,为什么不用?不是找麻烦吗?但是,实际上,如果你测试了这段代码你也许会发现有一个这样的error info(以我的运行环境为例):
文章图片
?? 我觉得出现了这样的报错信息,稍加思考就能理解和解答刚刚的问题了,因为我们的声明,仅仅是告诉了计算机地址,但是,却在解引用时,没有告诉计算机存在这个地址上面保存的数据类型,因此无法取出此地址上的保存的值,那么将代码的第8行改为:
文章图片
这样就能顺利的通过了编译和运行了,但是这样写的很麻烦,因此我们有了 区分int 和double 的写法如下:
int *p_demo;
double *p_tmp;
好吧,对于强迫症患者来说,还有一个问题:
int *p_demo;
int* p_demo;
上述的两种写法有区别吗?哪一个是正确的?好吧,日常自问自答。
其实两种声明的写法都是对的,第一种写法比较常用,第二种写法更符合**“类型 变量名”**的规则,但是如果问题是同时声明多个变量的时候,怎么办?
int* p_demo,p_tmp;
上面的代码,看似是声明两个指向int的指针类型的变量,其实实际上是声明一个指向int的指针p_demo和一个int型的p_tmp变量,至于为啥叫p_tmp?好吧,纯粹是为了误导你们,然后说这么一段话。。。
plus: 由于本人水平有限,如有错误的地方请及时指出,助我进步,谢谢… 【C/C++|有趣的C语言指针(二)——指针声明的那些事儿】
参考文献
- Stanley B. Lippman, et al.C++ Primer[M].电子工业出版社:2013
- [日]前桥和弥.征服指针[M].人民邮电出版社:2013.
推荐阅读
- C|关于指针的一点儿小知识
- Boost|C++ 结合 Boost(40行代码读写和处理 txt 文件)
- C/C++|容器(list用法及示例)
- C/C++|容器(forward_list用法及示例)
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并