我会事先说我要问指针的指针,所以我的话可能有点模糊,但试着留在我身边:)
我试图理解更改作为参数传递的指针如何在函数范围之外生效。到目前为止,这就是我所理解的:如果一个指针作为参数传递给一个函数,我只能改变指针指向的内容,而不是指针本身(我说的是一个在范围之外生效的更改)的功能,正如我所说)。如果我想更改指针指向的内容,我必须将指针传递给指针。
到目前为止我是对的吗?
另外,我注意到当我有一个包含一些指针的结构时,如果我想初始化那些指针,我必须将struct
作为指向指针的指针传递给初始化函数。这是出于同样的原因吗?
答案 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 $)接口)采用这种风格似乎只是更加神秘(或者,更可能的是,通过引用语言可以使用相同的接口)。
但请注意,如果要求指向指针的指针,该函数可能会执行与您随意假设的不同的操作。