值传递定义:
值传递是一种在函数调用中将实际参数的值复制给形式参数的方式,函数内部对形式参数的修改不会影响到实际参数的值。(说实话,我也看不懂)
上代码(看一下这个例子):
#include <stdio.h>
int main()
{
int a = 1,c=2;
int* b = &a;
int* d = &c;
*d = *b;
printf("%p,%d\n",b,*b);
printf("%p,%d",d,*d);
}
运行结果:
*b
表达式得到的是 b
所指向的内存位置上的值,即变量 a
的值。然后,通过 *d = *b;
的赋值操作,将 *b
的值赋给 *d
,即将变量 a
的值赋给变量 c
。
这意味着在这段代码中,发生的是值传递。变量的值被复制给另一个变量,而不是传递地址。
址传递定义:
地址传递是一种在函数调用过程中,将实际参数的地址传递给形式参数的方式,函数可以通过形式参数的引用或指针来直接访问和修改实际参数所在内存位置上的值。这种方式可以在函数内部对实际参数进行修改,使得修改在函数调用结束后仍然有效。
代码:
#include <stdio.h>
//这段代码演示了指针的赋值操作,但并没有涉及函数调用,因此不是典型的地址传递。
int main()
{
int a = 1,c=2;
int* b = &a;
int* d = &c;
d = b;
printf("%p,%d\n",b,*b);
printf("%p,%d",d,*d);
}
运行结果:
首先,代码声明了两个整数变量 a
和 c
,并分别初始化为 1
和 2
。
然后,定义了两个指针变量 b
和 d
,并将它们分别指向 a
和 c
的内存地址。
接下来,通过 d = b;
的赋值操作,将指针 b
的值(即 a
的内存地址)赋给指针 d
。这样,d
和 b
现在都指向了相同的内存地址,即变量 a
所在的内存地址。
最后,通过 printf
函数输出 b
和 d
的值以及它们所指向的内存地址。
总结起来,这段代码中展示了指针的赋值操作,但并没有涉及函数调用,因此不是典型的地址传递。它是通过赋值操作改变指针变量的指向,使得两个指针都指向了相同的内存地址。
可以先对比一下,体会一下值传递和址传递的区别。
以下是典型的地址传递:
代码:
#include <stdio.h>
// 通过地址传递交换两个整数的值
void swap(int *x, int *y)
{
int temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 1;
int b = 2;
printf("Before swap: a = %d, b = %d\n", a, b);
// 传递变量的地址给函数进行交换
swap(&a, &b);
printf("After swap: a = %d, b = %d\n", a, b);
return 0;
}
运行结果:
在这个例子中,定义了一个 swap
函数,它接受两个指针类型的参数 x
和 y
,用于指向要交换值的变量。
在 main
函数中,声明了两个整数变量 a
和 b
,并且初始化为 1
和 2
。
然后,通过把 a
和 b
的地址 &a
和 &b
传递给 swap
函数,实现了地址传递。
在 swap
函数内部,通过指针的解引用操作符 *
,可以直接访问和修改指向的内存地址上的值,实现了对 a
和 b
的交换。