2010-10-08 42 views
0

“双指针有时也用于通过引用传递指向函数的指针” 有人可以向我解释上述语句,指向通过引用方式?双指针有时也用于通过引用来传递指向函数的指针

+2

可能有助于获得更多的上下文。你能否提供该报价的链接? – JaredPar 2010-10-08 05:55:25

+0

[http://stackoverflow.com/questions/2570447/why-we-used-double-and-triple-pointer-in-objective-c-or-c-language]第一个答案 – Tony 2010-10-08 05:56:27

回答

4

我相信这个例子使得它更清晰:

+0

您的示例不需要双指针,也不使用函数指针。 – 2010-10-08 06:38:59

+0

这只是为了说明双指针如何工作。这个问题不是关于函数指针的,因此它不会涵盖它。 – Naveen 2010-10-08 06:39:48

+0

对不起,我误解了这个问题。如果你稍微编辑你的答案,我可以取消我的-1,否则它说我的投票被锁定在:( – 2010-10-08 07:00:22

2

这意味着你有一个函数需要一个指针指针(例如输入int **)。这允许你修改指针(指向哪个数据)的方式,通过引用指针允许传递指针。

void change (int *p) {*p = 7;} 
void Really_Change (int **pp) {*pp = null;} 

int p = 1; 
int *pp = &p; 
// now, pp is pointing to p. Let's say it has address 0x10; 

// this makes a copy of the address of p. The value of &p is still 0x10 (points to p). 
// but, it uses that address to change p to 7. 
change(&p); 
printf("%d\n", p); // prints 7; 


// this call gets the address of pp. It can change pp's value 
// much like p was changed above. 
Really_Change(&pp); 

// pp has been set to null, much like p was set to 7. 

printf("%d\n", *pp); // error dereference null. Ka-BOOM!!! 

所以,你可以传递一个指向int并更改该值以同样的方式,你可以传递一个指针的指针并改变其值(改变它所指向。)

+0

只是为了澄清英语语法...没有指向函数的指针;该函数是接收指向任意类型指针的指针。 – Potatoswatter 2010-10-08 06:01:21

+0

'cout << * pp << endl; //打印1;' 我认为它会打印'7'。 – Hemant 2010-10-08 06:44:19

+0

@Hemant:是的,我想我错过了编辑。谢谢。 – JoshD 2010-10-08 06:47:02

1

我会尝试用代码和简单的英语:)来解释。解释可能会很长,但这将是值得的。

假设我们有一个程序,运行它的main()函数,然后我们调用另一个需要参数int的函数。

从概念上讲,当你将一个变量作为参数传递给一个函数时,你可以这样做(粗略地说)两种方式:按值或通过引用。

“按值”是指给函数一个变量的副本。该函数将接收其“内容”(值),但它不能将实际变量更改到其自己的代码体外,因为它只有一个副本。

另一方面,“通过引用”意味着给函数提供变量的实际内存地址。使用它,函数可以找出变量的值,但它也可以到达指定的地址并修改变量的内容。

在我们的C程序中,“按值”意味着通过int的副本(仅以int作为参数),“通过引用”表示将指针传递给它。

让我们看到一个小的代码示例:

void foo(int n) { 
    n = 10; 
    printf("%d\n", n); 
} 

int main() { 
    int n = 5; 

    foo(n); 
    printf("%d\n", n); 

    return 0; 
} 

什么将这个程序的输出是什么? 10 10?不。 10 5!因为我们通过了int的副本,按价值而不是参照,foo()只修改了存储在其副本中的号码,无法达到main()的副本。现在

,如果我们这样来做:

void foo(int* n) { 
    *n = 10; 
    printf("%d\n", *n); 
} 

int main() { 
    int n = 5; 
    foo(&n); 
    printf("%d\n", n); 

    return 0; 
} 

这次我们引用了foo()我们的整数:它是实际的内存地址。 foo()具有完全的权力,通过访问它在内存中的位置来修改它,foo()main()正在使用相同的副本,因此输出将是10 10

正如你所看到的,指针是一个引用,... ,但也是一个在内存中的数字位置。它类似于int,只有内部包含的数字被解释为不同。想想这样:当我们通过引用传递int时,我们通过值传递一个int指针!。因此,值/参考逻辑可以应用于指针,即使它们已经是引用。

如果我们的实际的变量不是一个整数,而是一个int引用(指针),我们希望main()foo()共享该引用,以便foo()可以modifiy它的同一个副本,我们该怎么办?为什么当然,我们需要参考我们的参考!指向指针的指针。那就是:

int n; /* integer */ 
int* n; /* integer reference(pointer). Stores an int's position in memory */ 
int** n; /* reference to integer reference, or double pointer. 
      Stores int*'s memory address so we can pass int*s by reference. */ 

我希望这很有用。