形参为什么不能改变实参的地址
时间: 2023-11-30 18:04:50 浏览: 141
形参是函数定义中的参数,它是在函数调用时被传递的值的一个副本。形参的作用是提供一个局部变量来存储传递给函数的值,而不会对实参本身产生影响。
当我们将实参传递给函数时,实参的值会被复制到形参中。这意味着在函数内部对形参进行修改,并不会改变原始实参的值。形参和实参是两个不同的变量,它们在内存中有不同的存储位置。
如果我们想要在函数内部修改实参的地址,我们需要将实参的地址传递给函数,而不是传递实参的值。这可以通过使用指针作为函数参数来实现。
通过将指针作为参数传递给函数,我们可以在函数内部修改指针所指向的地址的值,从而影响到原始实参。
总结起来,形参不能改变实参的地址是因为形参是实参的副本,它们在内存中占据不同的位置。要改变实参的地址,需要将实参的地址传递给函数,并使用指针来修改实参的值。
相关问题
二级指针作为形参为什么能改变实参的地址
二级指针作为形参能够改变实参的地址是因为它可以通过间接引用访问到实参指针的地址,从而修改实参指针所指向的地址。
在C语言中,函数参数传递是按值传递的,即函数接收到的是实参的副本。当我们使用一级指针作为形参时,实参的地址是以值的方式传递给形参,所以在函数内部修改形参指针的值不会影响到实参指针的地址。
而当我们使用二级指针作为形参时,函数接收到的是实参指针的地址的副本,在函数内部通过间接引用操作可以访问到实参指针的地址,从而修改实参指针所指向的地址。因此,通过二级指针作为形参可以改变实参的地址。
下面是一个示例代码,演示了使用二级指针作为形参改变实参地址的情况:
```c
#include <stdio.h>
void changePointer(int** ptr) {
int* newPtr = NULL;
*ptr = newPtr;
}
int main() {
int* ptr = malloc(sizeof(int));
*ptr = 10;
printf("Before change: %p\n", (void*)ptr);
changePointer(&ptr);
printf("After change: %p\n", (void*)ptr);
free(ptr);
return 0;
}
```
输出结果为:
```
Before change: 0x7ffeedc49d50
After change: (nil)
```
可以看到,通过传递二级指针作为形参,函数内部将实参指针的地址设置为NULL,从而改变了实参的地址。
改变形参的同时怎么改变实参
改变形参的同时可以通过以下几种方式改变实参:
1. 通过传递引用类型的参数:当形参是引用类型时,可以通过修改形参所指向的对象的属性来改变实参。例如,在Java中,如果形参是一个数组,可以通过修改数组元素的值来改变实参。\[1\]
2. 通过返回值:在方法中对形参进行操作后,可以将修改后的值作为返回值返回给调用者,然后在调用者中将返回值赋给实参,从而改变实参的值。
3. 通过传递对象的引用:如果形参是一个对象的引用,可以通过修改对象的属性来改变实参。在Java中,对象是通过引用传递的,所以在方法中对对象的属性进行修改会影响到实参。\[3\]
需要注意的是,基本类型的参数是按值传递的,所以在方法中修改形参的值不会改变实参的值。\[2\]
#### 引用[.reference_title]
- *1* *3* [java方法改变形参后得到实参值是否改变](https://blog.csdn.net/weixin_39623271/article/details/114967841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [Java如何在调用方法时,同时改变实参的值? 即 形参改变实参](https://blog.csdn.net/weixin_35774446/article/details/114621523)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文