改变函数中的指针,c

我会事先说我要问指针的指针,所以我的话可能有点模糊,但试着和我在一起:)

我试图理解更改作为参数传递的指针如何在函数范围之外生效。 到目前为止,这是我所理解的:如果指针作为参数传递给函数,我只能更改指针指向的内容,而不是指针本身(我正在谈论将在范围之外生效的更改)的function,正如我所说)。 如果我想更改指针指向的内容,我必须将指针传递给指针。

我到目前为止对吗? 另外,我注意到当我有一个包含一些指针的结构时,如果我想初始化那些指针,我必须将struct作为指针传递给初始化函数。 这是出于同样的原因吗?

你是第一位的,但如果你已经分配了结构,那么你可以传递一个指向它的指针。 但是,如果函数分配了struct,那么要么使用函数return来收集新分配的struct的值,要么将指针传递给参数列表中的指针。

(我没有交流编译器,但我试图写一些例子)。

  • 你已经分配了指针

     int main(){
        struct x * px = malloc(...);
        INITX(PX); 
     }

     void intix(struct x * px){
         px-> ....
     }
 
  • 该函数分配了指针

      int main(){
        struct x * px = initx(); 
      }

      struct x * intix(){
         struct x * px = malloc(...);
         px-> ....
        返回px;
      }
 
  • 该函数分配了指针

      int main(){
        struct x * px;
        INITX(PX); 
      }

      void intix(struct x ** ppx){
         struct x * px = malloc(...);
         px-> ....
         * ppx = px;
      }
 

您应该了解的是指针是一个地址。 这意味着它说“对象的数据实际上就在那里”。 因此,您应该分开更改变量还是更改内存。

当您取消引用指针并指定您正在更改内存而不是变量时。

 int **x; int **p; int *q; 

箱图时间:

 +-----------+ +------+ +-----+ | x (**int) | -> | *int | -> | int | +-----------+ +------+ +-----+ 

假设我写到第一个框: x = p

 +-----------+ +------+ +-----+ | x (**int) | XX | *int | -> | int | +-----------+ +------+ +-----+ \ \ +------+ +-----+ -> | *int | -> | int | +------+ +-----+ 

假设我写到第二个框: *x = q

 +-----------+ +-----------+ +-----+ | x (**int) | -> | (*x) *int | XX | int | +-----------+ +-----------+ +-----+ \ \ +-----+ -> | int | +-----+ 

在C中,指针与数字没有太大差别。 您可以将其视为某些内容的数字内存地址。 接下来,在C中,所有内容都作为值传递。 这意味着,如果您获得一个传递给您的函数的指针,并且您更改它,则只更改指针的本地副本。 您对指针参数所做的更改不会在外部可见。

现在,如果我希望函数实际改变某些内容怎么办? 然后我把它的地址给了函数! 因此该函数知道我希望它改变的信息的实际位置,因此它可以改变它。 这是它在C中的工作方式。

希望这个解释能让事情更加清晰。

您在第一次计数时是正确的 – 在标准C中,只有值参数,并且您必须将指针传递给您希望在过程中修改的任何外部变量。

像结构初始化函数这样的东西想要指向指针的原因各不相同,但主要是为了与分配结构的类似函数的一致性,或者因为那个特定的函数组(我想到一些M $接口)有采用这种风格似乎只是为了更加神秘(或者更可能的是,通过引用语言可以使用相同的接口)。

但请注意,如果要求指针指向,则该函数可能正在执行与您随意假设的不同的操作。