C ++:指针作为函数的参数是否真的被复制了?

时间:2017-06-04 12:14:43

标签: c++ pointers

根据答案https://stackoverflow.com/a/11842442/5835947,如果您这样编码,函数参数Bubble * targetBubble将被复制到函数内。

bool clickOnBubble(sf::Vector2i & mousePos, std::vector<Bubble *> bubbles, Bubble * targetBubble) {
    targetBubble = bubbles[i];
}

然而,我做了一个测试,发现指针作为函数参数将与外部指针相同,直到我更改了它的值:

// c++ test ConsoleApplication2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "c++ test ConsoleApplication2.h"
using namespace std;
#include<iostream>




int main()
{
    int a= 1;
    int* pointerOfA = &a;

    cout << "address of pointer is" << pointerOfA << endl;
    cout << *pointerOfA << endl;
    func(pointerOfA);
    cout << *pointerOfA << endl;





}


void func(int *pointer)
{
    cout << "address of pointer is " << pointer  <<" it's the same as the pointer outside!"<<endl;

    int b = 2;
    pointer = &b;
    cout << "address of pointer is" << pointer <<" it's changed!"<< endl;

    cout << *pointer<<endl;


}

输出如下:

address of pointer is0093FEB4
1
address of pointer is 0093FEB4 it's the same as the pointer outside!
address of pointer is0093FDC4 it's changed!
2
1

所以,事实是,作为函数参数的指针不会被复制,直到它被改变,对吧?或者我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:2)

指针(只保存一个地址的变量 - 通常只是一个32位或64位整数)被复制。 指向的指针不是。

是的,你 缺少某些东西。您需要了解指针它指向的对象。它只是一个小整数值,表示&#34;那个对象在那里&#34; - 并且复制指针很便宜并且不会改变它所指向的内容。

答案 1 :(得分:0)

使用指针是因为它不会复制整个对象,而这可能是昂贵的,它将复制/ psas作为对象地址的参数。当您将指针传递给函数并在函数外部或函数中对其进行更改时,它将修改同一对象。您正在通过*p打印指向对象的值。如果要检查是否复制了指针变量,请输出p并检查哪些可能不同。