引例:
void f(int a) {
a = 3;
}
int main() {
int b = 2;
f(b);
}
例子中:a是形参,b是实参
传递过程&&内存情况:
在被调用前,函数的形参是不分配内存的,也就是说,不调用f()的话,a不在内存里面
一旦调用了函数,马上为函数的形参分配内存,此时分配一个int空间大小的内存给a,此时,a和b在内存中都有内存(不同的内存),传参的时候,程序传递实参的值给形参
所以:在f函数内部改变参数的值,只改变了形参的值,形参在函数结束后被释放,main里面的b值不变
当形参是数组的时候:
void f(int a[]) {
a[2] = 3;
}
int main() {
int b [5] = {1,1,1,1,1};
f(b);
}
此时情况有变,实际上这种情况下实参传递的是数组的首地址,那么一旦调用函数的时候,内存里会存在两个指针变量(一个形参一个实参),这两个变量指向同一位置,当然,函数内改变形参的值不会使得main里的实参地址发生变化,但是,由于两个参数指向同一位置,所以,通过形参来改变数组元素的值之后,main里面的实参在去访问数组的时候,数组的值已经改变
&和*的区别:
例子: int a;int *b = &a;
&符号用来处理一个变量,但不是通常的-访问这个变量的内容,而是取出这个变量的地址
int *b;此时b是一个指向int空间的指针,也就是说它是一个未分配的地址int*只用来定义,定义的变量是一个地址(索引),可以通过这个变量来对这段空间操作
而&是对一个已存在的变量取地址,取完地址之后同样可以通过地址操作
*x是找到x地址的变量,取它的值,所以*和&是反操作,&x得到x的地址*,*x得到x的值x