改变函数中的指针,c

时间:2011-09-25 11:53:45

标签: c pointers

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

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

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

4 个答案:

答案 0 :(得分:4)

你是第一位的,但是如果你已经分配了结构,那么你可以传递一个指向它的指针。但是,如果函数分配了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-> ....
        return px;
     }
 
  • 该函数分配了指针
 

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

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

答案 1 :(得分:3)

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

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

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 |
                                   +-----+

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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