指针值传递跟地址传递的区别
时间: 2024-05-18 09:08:09 浏览: 115
指针的值传递和地址传递是两种不同的传递方式。
1. 指针的值传递:在指针的值传递中,函数接收到的是指针变量的副本,即函数内部操作的是指针变量的副本而不是原始指针变量本身。这意味着在函数内部对指针进行修改不会影响到原始指针变量。
2. 地址传递:在地址传递中,函数接收到的是指针变量的地址,通过这个地址可以直接访问和修改原始指针变量所指向的内存。因此,在函数内部对指针进行修改会影响到原始指针变量。
总结起来,指针的值传递只是传递了指针变量的副本,而地址传递则传递了指针变量的地址,可以直接修改原始指针变量所指向的内存。
相关问题
指针值传递与地址传递
指针值传递和地址传递是两种不同的概念。在C语言中,函数参数可以通过值传递或地址传递来传递给函数。
指针值传递是指将指针变量作为参数传递给函数,函数中对指针所指向的内存进行操作。这种方式下,函数内部对指针的修改不会影响到原始的指针变量。但是,函数中对指针所指向的内存的修改会影响到原始内存。
地址传递是指将变量的地址作为参数传递给函数。这种方式下,函数内部对地址所对应的变量进行操作,会直接影响到原始变量的值。通过地址传递,可以实现在函数内部对原始变量进行修改。
下面是一个示例代码,展示了指针值传递和地址传递的区别:
```c
#include <stdio.h>
// 指针值传递
void pointerValuePass(int* ptr) {
*ptr = 10; // 修改指针所指向的内存
ptr = NULL; // 修改指针本身不会影响原始指针
}
// 地址传递
void addressPass(int* ptr) {
*ptr = 20; // 修改地址对应的变量
ptr = NULL; // 修改指针本身不会影响原始指针
}
int main() {
int num = 0;
int* ptr = #
printf("Before pointerValuePass: num = %d\n", num);
pointerValuePass(ptr);
printf("After pointerValuePass: num = %d\n", num);
printf("Before addressPass: num = %d\n", num);
addressPass(&num);
printf("After addressPass: num = %d\n", num);
return 0;
}
```
输出结果为:
```
Before pointerValuePass: num = 0
After pointerValuePass: num = 10
Before addressPass: num = 10
After addressPass: num = 20
```
可以看到,指针值传递修改了指针所指向的内存,但没有修改原始指针的值;而地址传递直接修改了原始变量的值。
C语言指针值传递和地址传递
C语言中的函数参数传递有两种方式:值传递和地址传递。对于指针类型的参数,可以通过地址传递来实现指针的传递。
值传递:将实参的值复制一份传递给形参,函数内部对形参的修改不会影响到实参的值。对于指针类型的参数,值传递只是将指针的值复制一份传递给形参,形参和实参指向同一块内存区域,但是函数内部对形参指针的修改不会影响到实参指针的值。
地址传递:将实参的地址传递给形参,函数内部对形参的修改会影响到实参的值。对于指针类型的参数,地址传递可以直接传递指针的地址,函数内部对形参指针的修改会影响到实参指针的值。
以下是两个例子,分别演示了值传递和地址传递的情况:
值传递:
```c
#include <stdio.h>
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 1, y = 2;
swap(x, y);
printf("x=%d, y=%d\n", x, y); // 输出:x=1, y=2
return 0;
}
```
地址传递:
```c
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 1, y = 2;
swap(&x, &y);
printf("x=%d, y=%d\n", x, y); // 输出:x=2, y=1
return 0;
}
```
阅读全文