1. 前置知识
C语言中的指针是一种很重要的数据类型,它存储了一个指向内存地址的值。在C语言中,指针可以指向不同类型的变量,如 char、int、float等。指针也可以指向函数、结构体和数组等。指针可以用来访问和操作数据,这使得它在C语言中具有非常重要的作用。
在C语言中,指针的类型又可以分为四种:近指针(near)、远指针(far)、巨型指针(huge)和无类型指针(void*)。其中前三种指针用于访问内存空间,而无类型指针则可以用来存储任何类型的指针。
2. 近指针
近指针是指在16位操作系统中使用的指针类型。近指针只能访问64KB的内存空间,因此在访问大内存空间时可能会发生溢出错误。近指针通常用于存储静态变量和全局变量的地址。
下面是一个使用近指针的示例,其中定义了一个指向静态数组的近指针:
#include <stdio.h>
int main() {
static int arr[5] = {1, 2, 3, 4, 5};
int near *p = arr;
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i));
}
return 0;
}
在这个示例中,我们定义了一个静态数组 arr 来存储数据。接下来定义了一个指向该数组的近指针 p。使用指针的方式可以访问数组中的元素,这里使用了一个 for 循环打印出了数组中的所有元素。
3. 远指针
远指针是指在16位操作系统中用于访问大内存空间的指针类型。远指针可以访问1MB以内的内存空间,远指针访问内存比近指针更为灵活、更可靠,但是会被分段,也会带来额外的开销。
下面是一个使用远指针的示例,其中定义了一个指向动态内存的远指针:
#include <stdio.h>
#include <stdlib.h>
int main() {
int far *p = (int far *)malloc(1024 * sizeof(int));
if (p == NULL) {
printf("Failed to allocate memory!");
return 1;
}
for (int i = 0; i < 256; i++) {
*(p + i) = i;
}
for (int i = 0; i < 256; i++) {
printf("%d ", *(p + i));
}
free(p);
return 0;
}
在这个示例中,我们使用了malloc()函数在堆内存中动态分配了1KB的内存空间,并将其地址赋给了一个远指针 p。接下来在远指针指向的内存空间中写入了256个整数,并使用远指针逐个打印出了这些整数。最后使用free()函数释放了内存。
4. 巨型指针
巨型指针是指在16位操作系统中,用于访问大于64KB但不超过1MB内存空间的指针类型。巨型指针既可以访问大内存空间,又不会招来额外的开销。但是,由于巨型指针仅限于16位操作系统上使用,所以在现代的32位和64位操作系统中已经很少使用了。
下面是一个使用巨型指针的示例,其中定义了一个指向动态内存的巨型指针:
#include <stdio.h>
#include <stdlib.h>
int main() {
int huge *p = (int huge *)malloc(65536 * sizeof(int));
if (p == NULL) {
printf("Failed to allocate memory!");
return 1;
}
for (int i = 0; i < 16384; i++) {
*(p + i) = i;
}
for (int i = 0; i < 16384; i++) {
printf("%d ", *(p + i));
}
free(p);
return 0;
}
在这个示例中,我们使用了malloc()函数在堆内存中动态分配了64KB的内存空间,并将其地址赋给了一个巨型指针 p。接下来在巨型指针指向的内存空间中写入了16384个整数,并使用巨型指针逐个打印出了这些整数。最后使用free()函数释放了内存。
5. 总结
在C语言中,近指针、远指针和巨型指针都是用于访问内存空间的指针类型。近指针只能访问64KB内存空间,远指针可以访问1MB以内的内存空间,而巨型指针可以访问大于64KB但不超过1MB内存空间。这些指针类型在16位操作系统中使用非常广泛,但在现代32位和64位操作系统中已经被淘汰。