指针的概念

时间:2014-02-08 03:01:52

标签: c pointers

我是C的新手,在阅读时我偶然发现了指针的概念。因此,在从多本书籍和网站引用之后,我仍然无法弄清楚如何使用指针来节省内存。

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

从上面的例子来看,ptr保存var的地址,var本身存储在另一个存储单元中。 所以我的问题是:

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

2)为什么我们不直接使用变量名( var in this case )而不是使用另一个内存空间作为指针

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

在Java和许多其他语言中,我们直接使用变量名称而没有指针。

答案 2 :(得分:1)

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

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

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

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

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

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

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

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

答案 3 :(得分:0)

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

Arr[1] = 3;

相当于:

*(Arr+1) = 3;

或考虑一个字符串

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

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

现在想一下情况,指针作为迭代器。所以,如果你要通过一个数组:

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

将前两个步骤合并为

是有意义的
  • 递增地址指针
  • 获取值

这里使用的空间在这里是合理的,不是吗?因为迭代器无论如何都可能使用过它。

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

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