指针的好处?

Nic*_*ick 17 c pointers

我最近对C编程感兴趣,所以我给自己写了一本书(K&R)并开始学习.

来自Java大学课程(基础知识),指针是一个全新的篇章,从我在线阅读的内容来看,这是一个相当困难的概念.在进入指针章节之前,我的印象是指针是C的主要部分,并提供了很大的好处.

在阅读本章并了解指针是什么以及它们如何工作时,这些好处对我来说并不明显.

例如(如果我完全错误,请纠正我)在K&R书中引用指针它说,因为我们通过值调用,当在函数调用中传递变量时,我们几乎传递了变量的副本函数处理,因此函数不能对原始变量做任何事情,我们可以用指针克服这个问题.

在稍后使用char指针的示例中,该书说增加char指针是合法的,因为该函数具有指针的私有副本."私人副本"不是使用指针的理由吗?

我想我对整个指针的使用有点困惑.如果被问到我可以使用指针而不是使用数组下标,但我怀疑这是指针的主要用途.

Linux和开源编程是我进入C的主要原因.我得到了一个C项目的源代码(Geany IDE),我可以看到在整个源代码中都使用了指针.

我也在论坛上做了一些搜索,发现了几个有类似问题的帖子.答案是(我引用):

如果您不知道何时应该使用指针,请不要使用它们.

当你需要使用它们时,每种情况都会有所不同.

我是否可以安全地避免在目前使用指针并且只在特定情况下使用它们(指针需要明显?)

ale*_*lex 9

指针的一个好处是,当您在函数参数中使用它们时,您不需要复制大块内存,也可以通过取消引用指针来更改状态.

例如,你可能有一个巨大的struct MyStruct,你有一个功能a().

void a (struct MyStruct* b) {
   // You didn't copy the whole `b` around, just passed a pointer.
}
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 8

来自Java,你的观点与K&R中的观点略有不同(K&R并不认为读者知道任何其他现代编程语言).

C中的指针就像Java中引用的稍微强大的版本.您可以通过名为的Java异常看到这种相似性NullPointerException.C中指针的一个重要方面是你可以通过递增和递减来改变它们所指向的内容.

在C中,你可以将一堆东西存储在一个数组的内存中,你知道它们在内存中并排放置.如果你有一个指向其中一个的指针,你可以通过递增指针使指针指向"下一个"指针.例如:

int a[5];

int *p = a; // make p point to a[0]
for (int i = 0; i < 5; i++) {
    printf("element %d is %d\n", i, *p);
    p++; // make `p` point to the next element
}
Run Code Online (Sandbox Code Playgroud)

上面的代码使用指针p依次指向数组a中的每个连续元素,并将它们打印出来.

(注意:上面的代码只是一个说明性示例,你通常不会用这种方式编写一个简单的循环.访问数组的元素会更容易a[i],而不是在那里使用指针.)


Ena*_*ane 5

你强调的规则非常明智。它会让你摆脱麻烦,但迟早你必须学习指针。

那么我们为什么要使用指针呢?

假设我打开一个文本文件并将其读入一个巨大的字符串。我无法按值向您传递巨大的字符串,因为它太大而无法放入堆栈(例如 10mb)。所以我告诉你绳子在哪里,然后说“去那里看看我的绳子”。

数组就是一个指针(几乎是这样)。

int[] 和 int* 略有不同,但大多数情况下可以互换。

int[] i = new int[5]; // garbage data
int* j = new int[5]   // more garbage data but does the same thing
std::cout << i[3] == i + 3 * sizeof(int); // different syntax for the same thing
Run Code Online (Sandbox Code Playgroud)

指针的一种更高级且非常有用的用法是使用函数指针。在 C 和 C++ 中,函数不是第一类数据类型,但指针是。因此,您可以将指针传递给您想要调用的函数,它们也可以这样做。

希望这会有所帮助,但很可能会令人困惑。