函数指针做形参

最后都变了- 提交于 2019-12-31 12:40:15

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 的值就成功了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!