有趣的C语言指针(二)——指针声明的那些事儿

指针的声明

  ok 在上一节的内容中,我们介绍了,C语言中的指针到底是个什么东西~,指针,包括三个概念:指针类型、指针类型的变量和指针类型的值。今天,我们进一步的讨论指针的其他有趣的case。


   我们知道,因为存在指针类型,所以存在着 “指针类型的变量”和 “指针类型的值”。而一般的指针类型的值表示的是“地址”。

  实际的应用中,地址一般都是以16进制的整型保存的,那么有个问题来了,既然指针类型的值是int型的(16进制),那为毛还要分“指向int的指针类型”和“指向double的指针类型”啊?有区别吗???
   我调研了一下, 从某种角度来看,指针类型和int类型应该是一回事。在C语言的前生——B语言中,指针和整数是没有区别的。但是不同的运行环境会导致int类型和指针类型的长度并不相同。另外,由于Intel8086 是16位的微处理器芯片,存在的功能缺陷限制着,16位的数值分成两组来表示20位的地址。大部分的环境中,指向int的指针类型和指向double的指针类型,还真的没啥区别。。。你敢信?不信也没办法,事实就是这样(都保持相同的表现形式,指向char的指针与指向int的指针内部表示和位数不一样)
另外,除基本的类型,还有一种可以“指向任何类型的指针类型”——void *类型

# include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
    int demo = 5;
    void *p_tmp;
    p_tmp = & demo; //这不会出错
    cout <<*p_tmp<<endl;
    return 0;
}

也许就会有朋友说了,尼玛,有个万能的指针类型,为什么不用?不是找麻烦吗?但是,实际上,如果你测试了这段代码你也许会发现有一个这样的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: 由于本人水平有限,如有错误的地方请及时指出,助我进步,谢谢…

参考文献

  • Stanley B. Lippman, et al.C++ Primer[M].电子工业出版社:2013
  • [日]前桥和弥.征服指针[M].人民邮电出版社:2013.
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值