分类目录

展开|收起

看你喜欢

(1) (1) (42) (1) (1) (1) (16) (2) (1) (1) (4) (1) (2) (7) (4) (1) (1) (1) (1) (3) (1) (5) (1) (1) (1) (1) (1) (2) (1) (4) (4) (3) (1) (1) (2) (1) (37) (2) (1) (5) (3) (1) (4) (1) (1) (11) (3) (1) (9) (3) (1) (23) (2) (1) (2) (1) (1) (1) (1)

最新精华

函数调用汇编分析【4】- 典型问题分析1(什么时候用指向指针的指针?)

许多时候,我们想通过调用一个函数来获取一个数据区的指针,编码时常常会被到底如何使用指针的问题困扰(到底是用一级指针,还是用指向指针的指针呢?),不得不定下心来仔细研究一番。在一些较复杂的链表操作中,指向指针的指针在实际代码中用得也很多,往往是看代码的一个难点,一般看到这种代码很难再气定神闲了,总要来回捣腾或动笔画画才行。问题的关键还是在于我们对函数调用的参数传递没有深刻或牢固的认识,导致我们没有很直接的反应,都是C语言把我们惯的。

分析1:

int add(int* c , int* d)
{
    int e;
    e=*c+*d;  
    c++;
    d++;
    return e;
}

void main()
{
    int a = 1;
    int b = 2;
    int c;
    int* p1;
    int* p2;

    p1=&a;
    p2=&b;

    c=add(p1,p2);
    while (1)
    {
    }
}

如上,add中的c++以及d++操作不会改变main函数中p1和p2的值,因为c和d操作的只是p1和p2在栈中的一个副本。这个小问题在代码中有时候会引起看代码的困惑,但其实是很简单的。

分析2:什么时候要用指向指针的指针呢?

从分析1看,如果我们要改变p1本身(而不是改变p1所指向的地址的内容),这种情况下就要用指向指针的指针。如果用一级指针,显然无法把结果返回给caller中的指针变量。当然我们可以用一个结果指针作为函数返回值传递给caller中的指针变量,这时候能正确的赋值。但不幸的是,有些时候,函数返回值要用来返回函数操作的错误码/成功。

  打分:5.0/5 (共3人投票)
(浏览总计: 34 次)
Add Comment Register



发表回复

  

  

  

您可以使用这些HTML标签

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>