指针是C语言中比较难理解的部分。(尤其是对于 * & 的使用不是很清楚)下面我们讲看看几个小例子。
在这里插入代码片
int n=5;
printf("n=%d\n",n);
int b=n;
printf("b=%d\n",b);
printf("n地址=%d\n",&n);
printf("b地址=%d\n",&b);
结果
n=5
b=5
n地址=6487580
b地址=6487576
从上述的结果中我们可以看到,b=n;操作将n的值复制给b,此时b的地址与n的地址不同,说明b在内存中开辟了一块新的内存空间。
接下里我们这样更改上诉代码(引用,相当于给)
int &b=n;
结果
n=5
b=5
n地址=6487572
b地址=6487572
从上述的结果中我们可以看到,&b=n;操作将n的值复制给b,此时b的地址与n的地址相同同,那么我们猜想两种情况中如果b+1以后,n的值怎样??
第一种情况中对b加一显然不会使得n变化,而二种情况中显然会使n变化,因为b+1改变了原有的内存地址,导致n发生变化。
根据上述两种情况即为传值调用和引用调用。
接下来我们看另一种情况
int n=5;
int *b=&n;
printf("n=%d\n",n);
printf("b=%d\n",b);
printf("n地址=%d\n",&n);
printf("b指向地址的内容=%d\n",*b);
结果
n=5
b=6487580
n地址=6487580
b指向地址的内容=5
int 类型的指针b将变量n的地址存放在了b中。
*b取得了b指向的地址中的内容即n的值5
接下来我们分别执行
b=6487572
n地址=6487572
b指向的内存中的内容=5
b+=1;
b=6487576
b指向的内存中的内容=6487576
n=5
n地址=6487572
我们发现b的值和多指向的内容变为了6487576(int 4),而未改变n中的内容
n=5
b=6487572
n地址=6487572
b指向的内存中的内容=5
*b+=1;
b=6487572
b指向的内存中的内容=6
n=6
n地址=6487572
我们发现n的值和地址已经发生了改变。
``
总结
传值时(a,b) int (int x,int y)x,y变动与a,b变动无关(地址不同)
引用(a,b) int (int &x,int &y) a,b会随着想x,y变动变动(地址相同)
地址 (&a,&b)int (int *x,int *y)相当于
x=&a;
y=&b;
a,b会随着 *x,*y改变而改变
(本人水平有限,欢迎指正交流)