- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境搭建
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if语句
- C - if...else语句
- C - 嵌套if语句
- C - switch语句
- C - 嵌套switch语句
- C语言中的循环
- C - 循环
- C - while循环
- C - for循环
- C - do...while循环
- C - 嵌套循环
- C - 无限循环
- C - break语句
- C - continue语句
- C - goto语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户自定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void指针
- C - 悬空指针
- C - 解引用指针
- C - 近指针、远指针和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入 & 输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- C - 指令
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类别
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的近指针、远指针和巨型指针
**近指针**、**远指针**和**巨型指针**等概念曾用于 C编程语言 处理分段内存模型。但是,在具有改进的 CPU架构 的现代计算环境中,这些概念已不再相关。
**近指针、远指针和巨型指针**的概念是在16位Intel架构中实现的,当时MS DOS操作系统正处于鼎盛时期。
近指针
C语言中的“**near**”关键字用于声明一个只能访问当前数据段内内存的 指针。在16位机器上,**近指针**是一个只能存储16位地址的指针。
**近指针**在给定时间段内只能访问大约64kb的小数据,这是其主要缺点。近指针的大小为2字节。
近指针语法
<data type> near <pointer definition> <data type> near <function definition>
以下语句声明了变量“ptr”的近指针:
char near *ptr;
近指针示例
请看下面的例子:
#include <stdio.h> int main(){ // declaring a near pointer int near *ptr; // size of the near pointer printf("Size of Near Pointer: %d bytes", sizeof(ptr)); return 0; }
输出
它将产生以下输出:
Size of Near Pointer: 2 bytes
远指针
**远指针**是一个32位指针,可以访问给定段之外的 计算机内存 中的信息。要使用此指针,必须分配“段寄存器”来存储段中的数据地址,并且还必须将另一个段寄存器存储在最新的段中。
**远指针**存储指针所指向的偏移地址和段地址。当指针递增或递减时,只有偏移部分发生变化。远指针的大小为4字节。
远指针语法
<data type> far <pointer definition> <data type> far <function definition>
以下语句声明了变量“ptr”的远指针:
char far *s;
远指针示例
请看下面的例子:
#include <stdio.h> int main(){ int number=50; int far *p; p = &number; printf("Size of far pointer: %d bytes", sizeof(number)); return 0; }
输出
它将产生以下输出:
Size of far pointer: 4 bytes
巨型指针
**巨型指针**与**远指针**具有相同的大小,为32位。巨型指针还可以访问位于段之外的位。
远指针是固定的,因此它们所在的段部分不能以任何方式修改;但是巨型指针可以修改。
在巨型指针中,偏移地址和段地址都会发生变化。这就是为什么我们可以使用**巨型指针**从一个段跳转到另一个段。由于它们比较绝对地址,因此您可以对其执行关系运算。巨型指针的大小为4字节。
巨型指针语法
以下是声明巨型指针的语法:
data_type huge* pointer_name;
巨型指针示例
请看下面的例子:
#include <stdio.h> int main(){ int huge* ptr; printf("Size of the Huge Pointer: %d bytes", sizeof(ptr)); return 0; }
输出
它将产生以下输出:
Size of Huge Pointer: 4 bytes
需要记住的指针
在使用近指针、远指针和巨型指针时,请记住以下几点:
- 近指针只能存储前64kB的地址,而远指针可以存储RAM中任何内存位置的地址。巨型指针可以在多个内存段之间移动。
- 近指针只能在一个寄存器中存储地址。另一方面,远指针使用两个寄存器来存储段地址和偏移地址。近指针的大小为2字节,而远指针和巨型指针的大小为4字节。
- 两个远指针值可以指向同一个位置,而在巨型指针的情况下,这是不可能的。
近指针、远指针和巨型指针用于基于段寄存器管理分段内存架构中的内存访问。现代系统使用平面内存模型,其中内存被寻址为单个连续空间。现代C编译器提供了更好的内存管理技术,这些技术不依赖于分段概念。