C++指针及函数参数的地址传递讲解
前景提示:
因为目前是对C#比较熟悉,而C++基础堪忧,在学习CGAL时,发现CGAL封装的函数体的参数中动不动就出现' & '、' * '这两个字符,接而疑惑于心中油然而生。
目前遇到以下两种情况。
第一种情况:函数定义中包含' * ';函数调用时使用' & '
//函数定义 Point_2* convex_hull_2(Point_2 *first, Point_2 *last, Point_2 *result ) //函数调用 Point_2 points[5] = { Point_2(0,0), Point_2(10,0), Point_2(10,10), Point_2(6,5), Point_2(4,1) }; Point_2 result[5]; Point_2* ptr = CGAL::convex_hull_2(&points[0], &points[5], &result[0]); //因为数组名其实是等于该数组第一个对象的地址,所以上下这两句其实是划等号的。 //Point_2* ptr = CGAL::convex_hull_2(points, points + 5, result);
第二种情况:函数定义中包含' & '
//函数定义 squared_distance(const Point_2<K> & pt1, const Point_2<K> & pt2) //函数调用 Point_2 p(1, 1), q(10, 10); double value = CGAL::squared_distance(p, q);
经查阅资料后总结出下列要点:
第一种情况:
1. int* address = &object1:表示对object1的对象进行取址,得到该对象的地址,赋值给指向int为目标类型的指针变量address;
2. int object1 = *address:表示将指针变量address进行解引用,得到地址中的对象,并赋值(此处为深拷贝)给object1;
3. void Function1(int* address):调用函数时传给形参address的实参必须是指针变量,在Function1中方法address地址和实参指针地址指向同一对象;
第二种情况
1. void Fun(int &a):a实际上是传进来实参的一个别名,a和传进来的实参具有相同的内存地址,在函数体内对a的修改都是直接修改传进来的实参(这一点和指针相似)。
举个栗子:
第一种情况
//指针传递 #include <iostream> void swap(int* a, int* b) { std::cout << "形参指针a的地址 = " << a << std::endl; std::cout << "形参指针b的地址 = " << b << std::endl; int tmp = *a; *a = *b; *b = tmp; } int main() { int a = 5; int b = 10; std::cout << "实参变量a的地址 = " << &a << std::endl; std::cout << "实参变量b的地址 = " << &b << std::endl; std::cout << "实参变量a的值 = " << a << std::endl; std::cout << "实参变量b的值 = " << b << std::endl; //调用函数,指针传递方式 swap(&a, &b); std::cout << "实参变量a的值 = " << a << std::endl; std::cout << "实参变量b的值 = " << b << std::endl; std::cout << "实参变量a的地址 = " << &a << std::endl; std::cout << "实参变量b的地址 = " << &b << std::endl; return 0; }
输出结果:
第二种情况
//指针传递 #include <iostream> //引用传递 void Fun(int& a) { std::cout << "形参引用a的地址 = " << &a << std::endl; a = 100; //对形参引用进行修改 } int main() { int a = 10; std::cout << "实参a的地址 = " << &a << std::endl; std::cout << "实参a的值 = " << a << std::endl; Fun(a); std::cout << "实参a的值 = " << a << std::endl; return 0; }
输出结果: