int k=7,m=5; void f(int **s) { int *t=&K; s=&t;*s=&m; printf("%d,%d;,%d,",k, *t, **s);} main() { int i=3,*p=&i,**r= &p;f(r); printf("%d,%d,%d\n", i, *p, **r); 则程序的输出结果是 755333为什么最后**r不是5
1个回答
关注
展开全部
您好亲,根据提供的代码,最后的输出结果是 755333。现在让我们逐步解析程序的执行过程来理解为什么最后 **r 不是 5。首先,在 main() 函数中定义了整数变量 i 并赋值为 3,然后定义了一个指向 i 的指针 p,并将其赋给二级指针 r。调用函数 f(r),将指向 r 的指针传递给函数 f()。在函数 f(int **s) 中,先声明整型指针变量 t 并将其指向 k,然后将指向 r 的指针 s 指向 t,接着将指向 t 的指针 s 指向 m。此时,s 指向 t,而 t 又指向 k,所以 *s 和 *t 都是指向 k,即 7。通过 *s=&m 将 s 指向的内存地址改变为 m 的地址,即指向了 m。执行 printf("%d,%d;,%d,", k, *t, **s);,输出结果为 7,7,5,。回到 main() 函数中,执行 printf("%d,%d,%d\n", i, *p, **r); 输出结果为 3,5,3。最后的输出结果中,**r 是 3 而不是 5 的原因在于,函数 f() 中的 s 指针虽然指向了 m,但它只是被复制到了一个局部变量 t 中,并没有改变原始的 r 指针所指向的地址。所以,**r 仍然是指向 i 的指针 p 所存储的值,即 3。
咨询记录 · 回答于2023-07-13
int k=7,m=5; void f(int **s) { int *t=&K; s=&t;* s=&m; printf("%d,%d;,%d,",k, *t, **s);} main() { int i=3,*p=&i,**r= &p;f(r); printf("%d,%d,%d\n", i, *p, **r); 则程序的输出结果是 755333为什么最后**r不是5
您好亲,根据提供的代码,最后的输出结果是 755333。现在让我们逐步解析程序的执行过程来理解为什么最后 **r 不是 5。首先,在 main() 函数中定义了整数变量 i 并赋值为 3,然后定义了一个指向 i 的指针 p,并将其赋给二级指针 r。调用函数 f(r),将指向 r 的指针传递给函数 f()。在函数 f(int **s) 中,先声明整型指针变量 t 并将其指向 k,然后将指向 r 的指针 s 指向 t,接着将指向 t 的指针 s 指向 m。此时,s 指向 t,而 t 又指向 k,所以 *s 和 *t 都是指向 k,即 7。通过 *s=&m 将 s 指向的内存地址改变为 m 的地址,即指向了 m。执行 printf("%d,%d;,%d,", k, *t, **s);,输出结果为 7,7,5,。回到 main() 函数中,执行 printf("%d,%d,%d\n", i, *p, **r); 输出结果为 3,5,3。最后的输出结果中,**r 是 3 而不是 5 的原因在于,函数 f() 中的 s 指针虽然指向了 m,但它只是被复制到了一个局部变量 t 中,并没有改变原始的 r 指针所指向的地址。所以,**r 仍然是指向 i 的指针 p 所存储的值,即 3。
如果我去掉m=5与*s=&m最后答案是777377为什么这时候**r又不指向i了
亲亲,如果你在函数 f() 中去掉了 m=5 和 *s=&m 这两行代码,那么最后的输出结果将会是 777377。我们来解析一下为什么此时 **r 不指向 i。首先,在 main() 函数中定义了整数变量 i 并赋值为 3,然后定义了一个指向 i 的指针 p,并将其赋给二级指针 r。调用函数 f(r),将指向 r 的指针传递给函数 f()。在函数 f(int **s) 中,先声明整型指针变量 t 并将其指向 k,然后将指向 r 的指针 s 指向 t。由于去掉了 *s=&m 这行代码,s 并没有指向 m,而是继续指向 k。执行 printf("%d,%d;,%d,", k, *t, **s);,输出结果为 7,7,7,。回到 main() 函数中,执行 printf("%d,%d,%d\n", i, *p, **r); 输出结果为 3,7,7。最后的输出结果中,**r 是 7,因为在函数 f() 中,指向 r 的指针 s 指向了 t,而 t 又指向 k,所以 **s 和 *t 都是指向 k,即 7。
所以我该类似怎么判断你所说的是否,复制到了局部变量t中,能总结一下规律吗
好的亲,在C语言中,函数参数的传递是通过值传递(pass by value)实现的。当你将一个指针作为参数传递给函数时,实际上是将指针的副本传递给函数内部。因此,在函数中对指针进行修改并不会影响原始指针的值。具体到你提到的代码中,我们可以总结一下规律:在函数 f() 中,指针变量 s 是一个指向二级指针的指针。当你在函数内部修改 s 的值时,只会修改函数内部的副本,不会改变原始指针的值。如果你想要修改原始指针的值,你需要通过解引用操作来修改它所指向的内存地址。例如,使用 *s = ... 来修改一级指针的值或者使用 **s = ... 来修改二级指针的值。请注意在函数 f() 中创建的局部变量 t,它只存在于该函数的作用域中,函数执行完毕后就会被销毁。如果你将局部变量的地址赋给外部的指针,那么这个指针将指向一个无效的内存地址。如果你想要在函数内部修改外部指针所指向的值,你需要使用间接访问操作符 * 来修改。例如,使用 *t = ... 来修改 t 指向的值。总结起来,要判断指针是否复制到了局部变量,在函数中是否修改了指针所指向的地址或者间接修改了指针所指向的值。如果仅仅在函数中修改了指针变量本身,并没有修改它所指向的地址或者间接修改了它所指向的值,那么指针并没有被复制到局部变量。
按你的说*s=&m即改变了,所以**r为5才对,我不懂,或者你不解释原理你可以浅显的说说当我什么看到什么的时候值不变
非常抱歉,我之前的回答有误。在函数中执行 *s = &m 会修改指针 s 所指向的地址,从而改变二级指针 r 所指向的值。因此,当你在函数 f() 中执行了 *s = &m 后,**r 的值会变为 5。对于你的代码,在以下情况下值会保持不变:在函数内部不对指针所指向的地址进行修改,例如不执行 *s = ... 或者 **s = ...。在函数内部不通过指针间接地修改指针所指向的值,即不执行 *t = ...。在这个特定的例子中,如果你将 *s = &m 这行代码保留,那么 **r 的值将会变为 5。而如果你去掉了 *s = &m 这行代码,**r 的值将保持为 7。