cpp] view plain copy
print?
#include <stdio.h>
void func(int* p)
{
printf("*p = %d/n", *p);
printf("&p = %p/n", &p);
}
int main(int argc, char *argv[])
{
int *a = new int(10);
printf("*a = %d/n", *a);
printf("&a = %p/n", &a);
func(a);
return 0;
}
编译:g++ -g -Wall test1.cpp
运行:./a.out
输出:
*a = 10
&a = 0xbfd4447c
*p = 10
&p = 0xbfd44460
我们看到输出,a 指向的地址的值和p 指向的地址里的值是一样的,都是10 。然而,对于指针a 和p 来说,它们自身的地址是不一样的,所以我们看到,函数func 复制了指针a 给p ,它们的值一样,但有不同的地址,是不同的指针。
我们再进一步:
[cpp] view plain copy
print?
#include <stdio.h>
void func(int* p)
{
printf("*p = %d/n", *p);
printf("&p = %p/n", &p);
printf("&*p = %p/n", &*p);
}
int main(int argc, char *argv[])
{
int *a = new int(10);
printf("*a = %d/n", *a);
printf("&a = %p/n", &a);
printf("&*a = %p/n", &*a);
func(a);
return 0;
}
编译输出:
*a = 10
&a = 0xbfe1c77c
&*a = 0x94b6008
*p = 10
&p = 0xbfe1c760
&*p = 0x94b6008
我们可以进一步看到,a 指针所指向的值的地址和p 指针所指向的值的地址是一样的,都是 0x94b6008 ,就如同上图所示,为了加深印象,再看一下这个图 ,然后再对比一下程序输出 ,然后在体会一下我在上面提到的两点 ,一点是:指针是有地址的 。另一点是:函数的参数是复制过去的 。
说到这里,我们再回到文章开始时提到的两个问题,一个是交换问题:
void exchange(int *x, int *y)
{
int *p=x;
*x = *y;
*y = *p;
}
那么这样为什么可以交换:
int a = 2;
int b = 3;
exchange(&a, &b);
上我们以a 和b 的地址传递给exchange 函数时,函数复制了这两个地址,并赋值给x 和y 这个两个指针,这两个指针是指向变量a 和b 的,它们的图形如下:
那么,当我们反引用指针时:
int *p=x;
*x = *y;
*y = *p;
我们操作的是a 和b 里面的变量的值,所以,我们交换a 和b 的值就成功了。
来源:CSDN
作者:北朽暖栀24
链接:https://blog.csdn.net/weixin_43484977/article/details/103773915