2010-10-16 120 views
2

我一直在试图在被调用的函数中创建一个指针变量,并以某种方式将它指向的值传递给主函数。我写了几个示例程序,但它似乎仍然错过了一些东西。而挑战在于使用指向指针的指针来实现这一点。这是我编写和测试的代码。我想我错过了一些明显的东西,你们可以指点一下吗?谢谢。功能和指针指针

 int one(int ***ptr) 
     { 
      static int *p,**pp,b=10; 
      p=&b; 
      pp=&p; 
      ptr=&pp; 
      printf("b:%d\tp:%d\tpp:%d\n",b,*p,**pp); 
      printf("Sub Ptr:%d\n",***ptr); 
      printf("Address of ***ptr:%d\n",&ptr); 
      return 32; 
     } 
     int main(int argc, char *argv[]) 
     { 
       static int ***ptr; 
       int a=200,*b,**c; 
       b=&a; 
       c=&b; 
       ptr=&c; 
       printf("Main Ptr:%d\n",&ptr); 
       a=one(ptr); 
       printf("Main Ptr:%d\n",&ptr); 
       printf("Main Ptr:%d\n",***ptr); 
       system("PAUSE"); 
       return 0; 
     } 

我得到了32的输出,它是函数的返回值。是否有可能获得被调用函数中指向的值10。

我也尝试过全局声明,但是din工作也是。我想维护本地声明,看看它是否可能...

回答

4

我想你误解了指针。你的代码的问题是,你没有意识到指针也是“按值传递”,函数中的指针是堆栈中的另一个变量,而不是你在主函数中声明的那个。

我会用一个更简单的例子,但这个想法是一样的。

void changePointerValue (int * ptr) 
{ 
    int newValue = 10; 
    ptr = &newValue; 
} 

int main() 
{ 
    int x = 20; 
    int * ptr = &x; 
    changePointerValue (ptr); 
    printf ("After Change: %d\n", *ptr); 
} 

您认为它会在主要功能中输出什么值?那是10吗?

但是不,实际上它会输出20.

为什么?让我们看看我们的代码是干什么的。在chagePointerValue(ptr)行中,计算机将主函数中的ptr值复制到堆栈上的新变量中,让我们将其称为ptr'并将其传递给changePointerValue函数。

所以实际上,changePointerValue函数中的ptr是ptr',而不是您在主函数中声明的那个。第二行changePointerValue,你给ptr'分配了一个新的内存地址,然后,ptr'被丢弃,因为函数被返回。主函数中的ptr保持相同的值,即指向x的内存地址。

如果你想输出为10,你需要在changePointerValue中设置ptr,分配意味着'改变ptr指向的值'。

void changePointerValue (int * ptr) 
{ 
    int newValue = 10; 
    *ptr = newValue; // Now you are change the content of the memroy cell where ptr is pointed at. 
} 

int main() 
{ 
    int x = 20; 
    int * ptr = &a; 
    printf ("Before Change:%d", x); // 20 
    printf ("Before Change:%d", *ptr); // 20 
    changePointerValue (ptr); 
    printf ("After Change: %d\n", *ptr); // 10 
    printf ("After Change: %d\n", x); //10 
} 

编辑:

所以,如果你想在主函数打印10,要做到这一点正确的做法是在函数尊重PTR。但是这也会改变主函数中变量a的值。

int one(int ***ptr) 
    { 
     ***ptr=10; // Dereference ptr to where it points to. (Varaible a in the main function) 
     return 32; 
    } 
    int main(int argc, char *argv[]) 
    { 
      static int ***ptr; 
      int a=200,*b,**c; 
      int result; 
      b=&a; 
      c=&b; 
      ptr=&c; 
      printf("Main Ptr:%d\n",&ptr); // The memory address of variable ptr. 
      result=one(ptr); 
      printf("Main Ptr:%d\n",&ptr); // the memory address of variable ptr. 
      printf("Main Ptr:%d\n",***ptr); // 10 
      printf("Main a:%d\n", a); // 10 
      printf("Main result:%d\n", result); //32 
      system("PAUSE"); 
      return 0; 
    } 
+0

错字:在你的例子中必须是“int * ptr =&x”(不是&a);) – zerm 2010-10-16 11:06:15

+0

感谢指针,我错过了2个东西,一个是解引用和堆。 – Gan 2010-10-16 11:07:56

+0

@zerm:更正了,谢谢。 – 2010-10-16 11:08:06

1

你正在设置ptr该地址的地址的一个局部变量(b),其中在函数结束时超出范围。这是未定义的行为。您需要分配到***ptrmalloc堆上的东西。

此外,您将按值传递ptr到函数。因此,任何本地修改都不会反映在main中。你需要传递指针,即你需要一个int ****作为参数。

我真的希望这不过是一次学习练习,因为任何两级以上的指针通常表示设计真的需要重新评估!

+0

我做这个mod在所调用的函数 “INT B = malloc的(的sizeof(int)的); B = 10;” 但结果仍然相同.... 这是你的意思还是我误解你? – Gan 2010-10-16 10:37:21

+0

不,我的意思是像'p = malloc(sizeof(int)); pp =&b; ptr = &pp; * p = 10;'。 – 2010-10-16 10:41:04

+0

我通过从堆中取出一些内存来做了更改,但结果仍然相同。 *** ptr在被调用的函数中指向10,但是当控制权返回到主函数时,它指向32.在这种情况下,我没有回答。它在我尝试的简单指针示例中工作。 – Gan 2010-10-16 10:52:26