Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改函数中的指针,c_C_Pointers - Fatal编程技术网

更改函数中的指针,c

更改函数中的指针,c,c,pointers,C,Pointers,我会提前说,我问的是指向指针的指针,所以我的话可能有点含糊不清,但请尽量和我在一起:) 我试图理解更改作为参数传递的指针如何在函数范围之外生效。到目前为止,我的理解是:如果指针作为参数传递给函数,我只能更改指针指向的对象,而不能更改指针本身(我所说的更改将在函数范围之外生效,正如我所说的)。如果我想改变指针指向的东西,我必须把一个指针传递给一个指针 到目前为止我说的对吗? 另外,我注意到,当我有一个包含一些指针的结构时,如果我想初始化这些指针,我必须将struct作为指向指针的指针传递给初始化函

我会提前说,我问的是指向指针的指针,所以我的话可能有点含糊不清,但请尽量和我在一起:)

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

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

您在第一位是对的,但是如果您已经分配了结构,那么您可以传递一个指向它的指针。但是,如果函数分配了结构,则可以使用函数return收集新分配的结构的值,或者传入指向参数列表中指针的指针

(我手头没有c编译器,但我试着写了一些例子)

  • 您已经分配了指针
int main(){ 结构x*px=malloc(…); initx(px); } void intix(结构x*px){ px->。。。。 }
  • 函数分配了指针
int main(){ 结构x*px=initx(); } 结构x*intix(){ 结构x*px=malloc(…); px->。。。。 返回px; }
  • 函数分配了指针
int main(){ 结构x*px; initx(&px); } 无效intix(结构x**ppx){ 结构x*px=malloc(…); px->。。。。 *ppx=px; }
在C语言中,指针与数字没有太大区别。你可以把它看作是某物的数字内存地址。接下来,在C中,所有内容都作为值传递。这意味着,如果将指针传递给函数,并对其进行更改,则只更改指针的本地副本。对指针参数所做的更改在外部将不可见

现在,如果我想让函数真正改变一些东西呢?然后我把它的地址给函数!所以函数知道我希望它改变的信息的实际位置,所以它可以改变它。这就是它在C中的工作方式


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

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

当您取消引用一个指针并指定给它时,您正在更改内存,而不是一个变量

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中,只有值参数,必须传递一个指针,指向要在过程中修改的任何外部变量

结构初始化函数希望指针指向指针的原因各不相同,但主要是为了与分配结构的类似函数保持一致,或者是因为特定的函数组(我想到的是一些m$接口)采用了这种风格,似乎只是为了更加神秘(或者,更可能的情况是,通过引用传递语言可以使用相同的接口)


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

+1这确实是看待它的方式。您所做的是修改内存。此图显示了内存是如何修改的。只是出于好奇,您是手动还是使用某些软件执行此操作的?@PreetSa我把图表打了出来。
+-----------+    +------+    +-----+
| x (**int) | -> | *int | -> | int |
+-----------+    +------+    +-----+
+-----------+    +------+    +-----+
| x (**int) | XX | *int | -> | int |
+-----------+    +------+    +-----+
             \
              \   +------+    +-----+
               -> | *int | -> | int |
                  +------+    +-----+
+-----------+    +-----------+    +-----+
| x (**int) | -> | (*x) *int | XX | int |
+-----------+    +-----------+    +-----+
                              \
                               \   +-----+
                                -> | int |
                                   +-----+