C指针只适用于实现数据结构吗?



我刚刚开始使用C的日常,并想知道,除了数据结构(如链表,二叉树等)指针有任何其他用途?注意:编辑

C没有通过引用传递的内置方法。指针是一个很好的实现方法。

你需要通过引用传递如果你想:

  • 修改给你的参数,例如,如果你的函数有多个返回值。
  • 将一个大的结构体传递给一个函数,而不完全复制它,这可能会非常浪费时间和内存。

C也没有内置的可变大小的数据结构。如果你需要一个数组,它的大小只在运行时才知道,只有两种方法可以得到它:

  1. 估计最大大小并始终分配它。
  2. malloc it,它会给你一个指针来工作。

显然,选项1是不好的,因为:

    如果你很少需要最大尺寸,这是浪费的。
  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;
    }
    
  • 跟踪动态分配的内存。内存分配函数malloccallocrealloc都返回指针值:
    #include <stdlib.h>
    ...
    // Dynamically allocate a block of N integers and assign
    // the resulting pointer to arr
    int *arr = malloc(sizeof *arr * N); 
    
  • 最后,创建动态数据结构,如列表、树、队列等。注意,你不需要使用指针来完成这个操作;一代又一代的Fortran程序员使用数组作为他们的"堆",数组的下标作为指针。

在系统和嵌入式编程中,指针还允许您直接访问视频内存,共享内存缓冲区,网络端口等。

它们也可以在处理数组和指针算术时使用,当然,还可以确保在传递参数时不进行深度复制。

函数指针非常有用。

指针可以用于很多事情,最重要的是直接访问内存位置。

最新更新