C 指针概念

C 指针概念,c,pointers,C,Pointers,我是C语言的新手,在阅读过程中,我遇到了指针的概念。因此,在参考了多本书和多个网站之后,我仍然无法理解指针是如何用来节省内存的 指针指向另一个变量的地址位置, 如: int*ptr=&var 从上面的例子中,ptr保存var的地址,它本身存储在另一个内存位置。 所以我的问题是: 1) 当指针值存储在单独的内存位置时,为什么要使用指针,从而提高内存使用率? 2) 为什么不直接使用变量名(本例中为var)而不是使用另一个内存空间作为指针呢在C中,指针允许更大的灵活性来操作变量。例如,如果将显式参数变

我是C语言的新手,在阅读过程中,我遇到了指针的概念。因此,在参考了多本书和多个网站之后,我仍然无法理解指针是如何用来节省内存的

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

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

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


2) 为什么不直接使用变量名(本例中为var)而不是使用另一个内存空间作为指针呢

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


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

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

Arr[1] = 3;
相当于:

*(Arr+1) = 3;

或考虑字符串< /P>

char *str = "I am a sequence of characters"
指针的大小确实与编译器定义的单词大小相等

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

  • 将迭代器的值增加1
  • 计算每个元素的地址
  • 获取值
将前两个步骤结合起来是有意义的

  • 递增地址指针
  • 获取值
这里的空间是合理的,不是吗?因为迭代器可能已经使用了它

类似地,指针也可以用来操纵程序,使其发挥最大的作用


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

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


当您传递变量时,它会在堆栈上创建一个新变量,该变量是该函数的本地变量。我们需要这些更改反映回调用函数中,然后您必须将变量传递回并重新分配。但对于指针,它使用的是原始变量,因此不需要将变量传回并还原。我从未使用过指针来节省内存,也从未听说过使用指针来节省内存。正如您所指出的,除了指向的变量之外,指针还会添加到所使用的内存中

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

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

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

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

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

指针也有缺点,这就是为什么Java等语言不使用指针的原因。Java使用内存引用或数据项句柄来代替指针。但是,使用句柄而不是指针意味着Java虚拟机可以识别用于垃圾收集的未使用内存区域,这会带来更多开销


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

想象一下,您有一个庞大的结构数组,它消耗12345 MiB的RAM。你想复制整个东西,还是只需要一个指向它的指针?对于比指针大的任何数据段,指针消耗的内存比副本少…但是假设我们要操作该结构中的数据,我们可以直接使用结构名称,而不是使用诸如struct_array[x]之类的指针。varname=5。。。而不是使用struct_ptr->varname=5@Vijayakumar如果需要,可以将所有内容声明为全局变量,这样就不需要通过传递指针浪费几个字节。只是有点小问题