改变函数中的指针,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 $接口)有采用这种风格似乎只是为了更加神秘(或者更可能的是,通过引用语言可以使用相同的接口)。
但请注意,如果要求指针指向,则该函数可能正在执行与您随意假设的不同的操作。