理解指针和地址变量的区别,以及如何正确进行函数传参
指针和地址变量的区别:
- 指针是一种变量,它存储的是另一个变量的地址(内存地址)。指针通过存储地址来间接操作某个变量。2. 地址变量是存储某个变量地址的普通变量。它直接存储地址这个数值。例如:
int a = 10;
int *p = &a; // p是指针,存储a的地址
int addr = &a; // addr是地址变量,存储a的地址
这里p是指针,addr是地址变量,它们都存储了变量a的地址,用于操作a。区别在于:- 指针被定义为指针类型,用于通过间接操作指向的变量。
- 地址变量被定义为普通变量,用于直接操作地址这个数值。正确的函数传参:1. 当我们需要函数修改某个变量时,应传递该变量的地址作为参数。这是因为函数内部不能修改外部变量本身,只能修改其地址访问到的变量。例如:
void add1(int *n) {
*n += 1; // 通过地址修改n的值
}
int main() {
int n = 0;
add1(&n); // 传地址
printf("%d\n", n); // 1
}
- 当我们需要函数返回某个变量的值时,也应传递其地址。这是因为函数只能返回局部变量,无法直接返回外部变量。通过地址我们可以修改外部变量,实现“返回”其值的效果。例如:
void getValue(int *ret) {
*ret = 10; // 通过地址给ret赋值,实现"返回"值
}
int main() {
int ret;
getValue(&ret);
printf("%d\n", ret); // 10
}
- 如果我们不需要函数修改外部变量,只需要读取,则可以直接传变量本身的副本。这是因为函数会在内部创建一个副本,操作这个副本不会影响外部变量。例如:
void print(int n) {
printf("%d\n", n);
}
int main() {
int n = 10;
print(n); // 直接传值,打印10
printf("%d\n", n); // n仍为10
}
所以总结来说,正确的函数传参应遵循:- 如果需要修改或返回外部变量的值,传其地址
- 如果只需要读取外部变量,直接传值
- 明确指针与变量的区别,理解通过地址操作变量