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;
}

  输出结果:

posted @ 2022-12-21 16:09  ShawBlack  阅读(912)  评论(0编辑  收藏  举报