【问题标题】:Concept of pointers指针的概念
【发布时间】:2014-03-05 16:03:45
【问题描述】:

我是 C 新手,在阅读时遇到了指针的概念。所以,经过多本书籍和网站的引用,我仍然无法弄清楚如何使用指针来节省内存。

一个指针指向另一个变量的地址位置, 例如: int *ptr =&var;

从上面的例子来看,ptr 保存了 var 的地址,它本身存储在另一个内存位置。 所以我的问题是:

1) 当指针值存储在单独的内存位置时,为什么要使用指针,从而增加内存使用率?

2) 为什么我们不直接使用变量名(在这种情况下为var)而不是为指针使用另一个内存空间

【问题讨论】:

  • 想象一下,你有一个庞大的结构数组,消耗 12345 MiB 的 RAM。你想复制整个东西,还是只是有一个指向它的指针?对于任何比指针大的数据,指针比副本消耗的内存少……
  • 但是假设如果我们要操作那个结构体中的数据,我们可以直接使用结构体名称而不是使用像struct_array[x].varname=5这样的指针...而不是使用struct_ptr-> varname=5
  • @Vijayakumar 如果您愿意,可以将所有内容声明为全局变量,然后您无需通过传递指针来浪费几个字节。这种方法唯一的一个小问题是,由于没有封装的可能性,它导致代码非常难以维护。

标签: c pointers


【解决方案1】:

在 C 中,指针允许更灵活地操作变量。例如,如果您将显式参数变量作为指针传递给函数并更改其值,则新变量值将保存在函数外部。如果直接作为变量传入函数,则变量的新值不会保存在函数外部。还有一些使用指针对变量执行的字节级操作。

在Java等很多语言中,我们直接使用变量名,没有指针。

【讨论】:

    【解决方案2】:

    您知道的某些实体在后面使用指针。例如:C 中的数组。你知道吗

    Arr[1] = 3;
    

    相当于:

    *(Arr+1) = 3;
    

    或者考虑一个字符串

    char *str = "I am a sequence of characters"
    

    确实,指针占用的大小等于编译器定义的字大小。

    现在想一个情况,指针作为一个迭代器。因此,如果您将数组作为:

    • 将迭代器的值增加 1。
    • 评估每个元素的地址
    • 获取价值

    将前两个步骤组合为

    • 增加地址指针
    • 获取价值

    这里使用的空间是合理的,不是吗?因为迭代器可能已经使用了它。

    同样,指针可用于操作您的程序以充分利用它。

    编译器是你优化东西的朋友,但即使是朋友也可以使用一些帮助,你可以通过使用指针来提供帮助。指针允许您以其他有限构造永远不允许您这样做的方式来定制您的程序。

    【讨论】:

      【解决方案3】:

      指针并不完全用于节省内存的概念。即使某些情况下会节省一点内存,例如将参数(如 struct )及其地址传递给函数而不是变量本身。结构的大小可能超过 4 个字节,而指针大小只是 fiur 。它主要用于简化数据操作并避免冗余步骤。了解按值传递和传递引用,您就会知道为什么要使用指针。 你的问题为什么传递给指针而不是变量本身。

      当您传递变量时,它会在堆栈上创建一个新变量,该变量是该函数的本地变量,我们需要将这些更改反映回调用函数中,然后您必须将变量传回并重新分配。但在指针的情况下,它使用的是原始变量,因此不需要那些将变量传回和恢复相同的额外步骤。

      【讨论】:

        【解决方案4】:

        我从未使用过指针来节省内存,也从未听说过使用指针来节省内存。正如您所指出的,除了指向的变量之外,指针还会添加到使用的内存中。

        指针提供的主要功能是一种指向内存位置的句柄,因为它包含变量的地址。拥有指向内存位置的指针提供了一种灵活性,因为当必须从程序的各个部分引用内存区域时,您只需使用指针即可。

        使用指针还允许您使用动态内存分配。您可以为变量分配内存区域并使用指针访问该区域。

        对于简单的变量和简单的程序,指针并没有那么有用。然而,对于具有大型复杂变量且生命周期不同的复杂程序,指针非常有用。

        指针对于直接内存位置/地址用于设备交互的应用程序也很有用,例如您在嵌入式软件中看到的。您使用指针来访问用于与设备通信的共享内存区域。

        C 中的指针还允许您更轻松地使用算法和复杂的数据结构,例如树和链表。指针的使用减少了将数据从一个内存位置复制到另一个内存位置所花费的 CPU 时间,因为您不是将数据从一个位置移动到另一个位置,而是更改了指针的值。

        指针有一些缺点,这就是 Java 等语言不使用它们的原因。 Java 使用内存引用或数据项句柄代替指针。这涉及更多开销,但是使用句柄而不是指针意味着 Java 虚拟机可以识别未使用的内存区域以进行垃圾回收。

        C 最初被设想为一种用于操作系统和系统软件的系统编程语言,其中需要效率和尽可能少的开销。指针是 C 执行某些内存访问的方式,如果指针不存在,则需要使用汇编语言。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多