专栏首页C语言入门到精通基础知识 | 每日一练(59)

基础知识 | 每日一练(59)

基础知识练习

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

学生:说真的, 真有机器用非零空指针吗, 或者不同类型用不同的表达?

小林:至少 PL/I, Prime 50 系列用段 07777, 偏移 0 作为空指针。后来的型号使用段0, 偏移 0 作为 C 的空指针, 迫使类似 TCNP (测试 C 空指针) 的指令明显地成了现成的作出错误猜想的蹩脚 C 代码。

旧些的按字寻址的 Prime 机器同样因为要求字节指针 (char *) 比字指针 (int *) 长而臭名昭著。Data General 的 Eclipse MV 系列支持三种结构的指针格式 (字、字节和比特指针), C 编译器使用了其中之二:char * 和 void * 使用字节指针, 而其它的使用字指针。

某些 Honeywell-Bull 大型机使用比特模式 06000 作为 (内部的) 空指针。CDC Cyber 180 系列使用包含环 (ring), 段和位移的 48 位指针。多数用户

(在环 11 上) 使用的空指针为 0xB00000000000。

在旧的 1 次补码的 CDC 机器上用全 1 表示各种数据, 包括非法指针, 是十分常见的事情。旧的 HP 3000 系列对字节地址和字地址使用不同的寻址模式; 正如上面的机器一样, 它因此也使用不同的形式表达 char * 和 void * 型指针及其它指针。

Symbolics Lisp 机器是一种标签结构, 它甚至没有传统的数字指针; 它使用<NIL, 0> 对 (通常是不存在的 <对象, 偏移> 句柄) 作为 C 空指针。

根据使用的 “内存模式”, 8086 系列处理器 (PC 兼容机) 可能使用 16 位的数据指针和 32 位的函数指针, 或者相反。

一些 64 位的 Cray 机器在一个字的低 48 位表示 int *; char * 使用高 16 位的某些位表示一个字节在一个字中的偏移。

学生:考虑到有关空指针的所有这些困惑, 难道把要求它们内部表达都必

须为 0 不是更简单吗?

小林:如果没有其它的原因, 这样做会是没脑筋的。因为它会不必要地限制某些实现, 阻止它们用特殊的非全零值表达空指针, 尤其是当那些值可以为非法访问引发自动的硬件陷阱的时候。

况且, 这样的要求真正完成了什么呢?对空指针的正确理解不需要内部表达的知识, 无论是零还是非零。

假设空指针内部表达为零不会使任何代码的编写更容易 (除了一些不动脑筋的 calloc() 调用)。用零作空指针的内部表达也不能消除在函数调用时的类型转换, 因为指针的大小可能和 int 型的大小依然不同。

本文分享自微信公众号 - C语言入门到精通(gh_780327809188)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 8.5 指针小结

    1、一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址,其概念与以前类似,只是返回的值的类型是指针类型。

    闫小林
  • 基础知识 | 每日一练(58)

    小林:C 程序员传统上喜欢知道很多要知道的还要多关于机器实现的细节。空指针在源码和大多数机器实现中都用零来表示的事实导致了很多无根据的猜测。

    闫小林
  • C语言 | 每日基础(41)

    读者:为什么在调用 free() 之后指针没有变空?使用 (赋值, 比较) 释放之 后的指针有多么不安全?

    闫小林
  • 空指针 到底是什么意思?

    各位,前段时间我们有推文介绍过野指针和悬空指针,那C中还有一个叫做空指针的名词,它究竟是指什么呢,今天就跟大伙聊聊这个空指针。

    7089bAt@PowerLi
  • 视频流媒体平台编译中如何运用Go语言指针?

    本文讲的也是我们在编译流媒体平台EasyNVR的时候,碰到的go语言指针问题,就打算为大家介绍一下Go语言指针的运用。

    EasyNVR
  • C语言指针5分钟教程

    指针、引用和取值 什么是指针?什么是内存地址?什么叫做指针的取值?指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内 存...

    猿人谷
  • Golang语言--指针

    在Go中指针是很容易学习的。一些进入编程任务,指针更容易操作,如通过引用调用,需要要使用指针来执行。所以学习指针成为完美Go程序员很有必要。让我们开始学习指针的...

    李海彬
  • 怎样熟练掌握C语言的指针?

    从事C语言开发已经超过10个年头,越来越觉得指针的方便之处,但在初学者来看指针就是拿下这门编程最大的拦路虎,毕竟很多人开始学习C语言都是激情四射结果遇上了指针猫...

    程序员互动联盟
  • 142. Linked List Cycle II

    首先要证明链表有环: 用快慢两个指针解决。快指针每次走两步,慢指针每次走一步。如果有环,则一定会最终在环内某点相遇。下面证明这一点:

    平凡的学生族
  • 【编程基础】C语言指针函数和函数指针

    往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面详细为大家介绍C语言中指针函数和函数指针。 一、指针函数 当一个函数声明其返回值为一个指针时,实...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券