直观地解释指针及其意义?

时间:2012-08-10 05:05:09

标签: c++ c pointers function-pointers indirection

我很难理解指针,尤其是函数指针,我希望有人可以给我一个关于它们究竟是什么以及它们应该如何在程序中使用的概述。 C ++中的代码块将特别受欢迎。

谢谢。

6 个答案:

答案 0 :(得分:9)

indirection的概念非常重要。

这里我们通过increment(x)传递值(注意创建和操作本地副本,而不是原始版本):

pass by value

在这里,通过increment(&x)指针(内存地址):

pass by pointer

请注意,引用与指针的工作方式类似,只是语法类似于值副本(obj.member),并且指针可以指向0(“null”指针),而引用必须指向非 - 零内存地址。

另一方面,

函数指针允许您通过方便地传递和处理函数来动态地更改代码在运行时的行为,就像传递变量一样。 Functors通常是首选的(特别是STL),因为它们的语法更清晰,并且允许您将本地状态与函数实例相关联(阅读callbacksclosures,两者都是有用的计算机科学概念)。对于简单的函数指针/回调,由于它们的紧凑和就地语法,经常使用lambdasC++11中的新内容)。

答案 1 :(得分:3)

指向该点的指针是一个具有该点地址的整数值。 指针可以指向其他指针。然后你可以更加间接地获得价值。

参考运算符(&): 您可以将指针等同于变量或指针的引用。

取消引用运算符(*): 您可以获得指针指向的单元格值。

当通过引用传递给函数时,数组会被衰减为指针。

函数指针没有内联,使程序更具功能性。回调就是一个例子。


enter image description here


enter image description here


enter image description here


enter image description here


enter image description here

答案 2 :(得分:1)

在这里您可以找到函数指针的一些示例用法: http://www.cprogramming.com/tutorial/function-pointers.html

答案 3 :(得分:1)

作为类比,将计算机中的内存视为Excel工作表。相当于在C / C ++程序中为变量赋值将是在Excel工作表上的单元格中写入内容。从变量中读取就像查看单元格的内容一样。

现在,如果您有一个内容为“B8”的单元格(比如说C3),您可以将该内容解释为对另一个单元格的引用。如果以这种方式处理单元格C3,则C3变为指针。 (在Excel中,您可以通过在{C3}中输入=B8来实际实现此行为。

在这种情况下,您基本上声明在C3中引用了您感兴趣的值的单元格。在C ++中,这可能类似于:

int  B8 =  42;
int* C3 = &B8;

你现在有两个变量占用内存。现在,如果你想知道C3指向的是什么,你将使用

int my_value = *C3;

对于函数指针:这些变量就像普通指针一样,但它们指向的地址(单元格)不仅仅是一个值,而是一个可以调用的函数。

答案 4 :(得分:1)

为了理解指针,我需要了解一下硬件和内存布局。

计算机内存可以看作是带抽屉的橱柜。当您“取消引用”您在抽屉内看到的指针时,指针可以指向任意抽屉,即存储在“抽屉”中的值:


e.g. ten numbers stored after one another

short a[] = {9,2,3,4,5,6,7,8,1,-1] ; 

in memory the values that consist the array 'a' are stored sequentially

   +---+---+---+---+---+---+---+---+---+---+
a->| 9 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 1 | -1|
   +---+---+---+---+---+---+---+---+---+---+

the 'a' array above is a pointer and is the start address where the
values are stored in memory.

short* ptr = 0; // a pointer not pointing to anything (NULL)

ptr = a + 5; // the pointer is now pointing to the 6th value in the array
// the + 5 is an offset on the starting address of a and since the type of
// a is short int array the compiler calculates the correct byte offset based
// on that type. in the above example 5 is 5 short ints since ptr is of type 
// short*

*ptr has the value 6 i.e. we are looking at what the ptr is pointing to.

每个“抽屉”的大小由存储的数据类型决定 在上面的例子中,存储了10个短整数,每个短整数占用2个字节 所以整个数组占用20个字节的内存(sizeof(a))

答案 5 :(得分:0)

变量存储值。 指针也存储值。唯一的区别是它们是内存地址。他们仍然是数字。 这里没什么复杂的。 您可以将所有指针存储在int或long变量中:

  int p = 43567854;
  char *p1 = (char *) p;

但是将它们存储在指针变量中的好处是,您可以描述指针指向的地址中保存了哪种类型的变量。

使指针变得复杂的是必须与它们一起使用的隐式语法。语法是含糊不清的,因此类型简短。 喜欢:

  &p = return address of variable
  *p = return the value of first member of array that is stored at the address

通过使用以上两个规则,我们可以编写此密码:

  &(*++t)

翻译成人类语言的时间很长: 将t的值增加1。这现在指向指针指向的值数组的第二个成员。然后获取第二个成员(*)的值,然后获取该值的地址。如果我们打印此指针,它将打印除第一个字符以外的整个字符串。

您应该制作一个“指针语法备忘单.txt”,您感觉很好。 并打开“指针测试”项目以测试您不清楚的所有内容。

指针在某种程度上类似于正则表达式。