我刚刚开始使用C的日常,并想知道,除了数据结构(如链表,二叉树等)指针有任何其他用途?注意:编辑
C没有通过引用传递的内置方法。指针是一个很好的实现方法。
你需要通过引用传递如果你想:
- 修改给你的参数,例如,如果你的函数有多个返回值。
- 将一个大的结构体传递给一个函数,而不完全复制它,这可能会非常浪费时间和内存。
C也没有内置的可变大小的数据结构。如果你需要一个数组,它的大小只在运行时才知道,只有两种方法可以得到它:
- 估计最大大小并始终分配它。
-
malloc
it,它会给你一个指针来工作。
显然,选项1是不好的,因为:
- 如果你很少需要最大尺寸,这是浪费的。
- 如果需要更改最大值,则必须重新编译。
剩下选项2,它需要指针。如果C语言有引用,这就不一定成立了,但正如我之前所说的,它不是这样的。
如果我给它更多的时间,我可能会想出很多其他的用途。
可以使用函数指针将一个通用的功能包装在不同的函数中。
是的,例如,指针可以指向函数,所以你可以根据变量类型编写调用函数的泛型算法。见http://en.wikipedia.org/wiki/Function_pointer
除了遍历数据结构之外,最有用的功能是拥有可以更改的函数参数。一个非常基本的例子:void increment(int a)
{
a = a+1;
}
不会改变a
的值,因为在函数内部,您只处理变量的副本。
但是,如果您使用指针,它将工作:
void increment(int *a)
{
*a = *a+1;
}
当然,你必须这样命名:increment(&a)
.
指针是内存地址。每当你想引用存储在内存某处的东西时,你就使用指针。因此,您可以使用指针来引用数据,而不一定只是作为数据结构的一部分—您还可以使用指针来定位充满文件内容的缓冲区,或者记住该缓冲区中的特定位置。每次malloc()
一块内存或声明一个数组时,您都在使用指针。正如其他几个人指出的那样,您也可以使用指针指向函数——函数名本身实际上就是一个指针。指针还用于维护使程序工作的关键数据结构,特别是堆栈和堆。许多连接到微处理器的设备都是内存映射的,这意味着你通过读写特定的内存位置来访问它们。
C语言中的指针有三个主要用途:
- 伪造引用传递语义。由于C语言通过值传递所有函数实参,因此函数修改实参值的唯一方法是传递指向实参的指针:
#include <stdio.h> void foo(int *a, int b) { *a = 1; b = 2; } int main(void) { int x = 0, y = 0; printf("before: x = %d, y = %dn", x, y); // output should be "before: x = 0, y = 0" foo(&a, b); printf("after: x = %d, y = %dn", x, y); // output should be "after: x = 1, y = 0" return 0; }
- 跟踪动态分配的内存。内存分配函数
malloc
、calloc
和realloc
都返回指针值:#include <stdlib.h> ... // Dynamically allocate a block of N integers and assign // the resulting pointer to arr int *arr = malloc(sizeof *arr * N);
- 最后,创建动态数据结构,如列表、树、队列等。注意,你不需要使用指针来完成这个操作;一代又一代的Fortran程序员使用数组作为他们的"堆",数组的下标作为指针。
在系统和嵌入式编程中,指针还允许您直接访问视频内存,共享内存缓冲区,网络端口等。
它们也可以在处理数组和指针算术时使用,当然,还可以确保在传递参数时不进行深度复制。
函数指针非常有用。
指针可以用于很多事情,最重要的是直接访问内存位置。