2014-01-16 3 views
-1

변수의 메모리 주소를 결정하는 방법을 알아 내려고하고 있습니다. 어느 것이 올바른 사용법인지 모르겠습니다.C++ - 변수의 주소를 올바르게 결정하는 방법?

#include <iostream> 
#include <string> 
using std::cout; 
using std::endl; 
void print(std::string *url) { 
    std::string url_1 = "http://example.com"; 
    cout << url << endl; 
    cout << "Adress: " << &url << endl; 
    *url = url_1; 
    cout << "Adress: " << &url << endl; 
} 
int main() { 

    std::string a = "http://google.com"; 
    print(&a); 
    cout << a << endl; 
    cout << &a << endl; 
    return 0; 
} 

출력 :

0xbfa1ba48 
Address: 0xbfa1ba34 
Address: 0xbfa1ba34 
http://example.com 
0xbfa1ba48 

변수의 내용을 변경, 메모리 주소 변경뿐만 아니라합니까? 변수의 실제 메모리 주소를 어떻게 얻습니까?

+3

올바른 변수 주소 –

+1

을 인쇄하고 있습니다. 여기에'std :: addressof'를 언급 할 기회가 생길 것이라고 생각했습니다. – chris

+3

사람이 집에서 나가 다른 사람이 이사하면 집 주소가 바뀌나요? –

답변

0

'&'연산자를 사용하면 올바른 변수 주소를 얻을 수 있습니다. 그러나 귀하의 프로그램은 이것을 너무 잘 보여주지 않습니다.

void print(std::string *url) { 

변수 URL에 문자열 개체의 주소가 전송됩니다.

cout << "Adress: " << &url << endl; 

여기서 문자열 개체 자체의 주소가 아닌 문자열 개체의 주소가 포함 된 변수의 주소를 인쇄하고 있습니다.

*url = url_1; 

앞의 '*'는 포인터 url을 참조 해제하므로 원래 값에 새 값이 할당됩니다.

포인터의 원래 문자열 개체 주소가 변경되지 않습니다.

원래 문자열 개체의 주소도 변경되지 않습니다. C++의 문자열은 문자열을 포함하는 문자 배열에 대한 포인터를 내부적으로 저장하는 객체로 구현되므로 주소가 아닌 문자열 객체의 내부 내용 만 변경하면됩니다.

일반적으로 변수에 값을 할당해도 변수의 주소는 변경되지 않고 내용 만 변경됩니다.

1

코드에서 url은 함수에 전달 된 주소를 포함하는 포인터입니다. 주소는 a 일 수 있습니다. url&a을 출력 할 때마다 같은 결과를 얻습니다.

반면에 &url이라는 표현은 url 변수의 주소를 취하고 있습니다 (따라서 가리키는 문자열 개체와 관련이 없습니다). 그러나 다시, &url의 값은 출력 할 때마다 동일합니다.

그래서 객체를 변경해도 메모리 주소는 변경되지 않습니다.

0

내가 다음 코드 disassamble하려고

int pranit = 2; 
int& sumit = pranit; 

int main(int argc, char** argv) { 
    sumit++; 

    return sumit; 
} 

그리고 다음 명령 pranit 제안은 SUMIT의 주소가 있습니다.

013B13C8 8B15 04803B01 MOV EDX,DWORD PTR [sumit]    ; ConsoleA.pranit 

는 또한 두 변수 I는 분해기로 올리 디버그를 사용한

Names in ConsoleA, item 313 
Address=013B8004 
Section=.data 
Type=Library 
Name=sumit 

Names in ConsoleA, item 257 
Address=013B8000 
Section=.data 
Type=Library 
Name=pranit 

다른 주소를 가지고있다.

0

올바른 주소 변수를 사용하는 방법은 std::addressof()입니다.

&은 대부분 업무를 수행하지만 오버로드가 operator & (가상 상속 포함) 인 경우 실패 할 수 있습니다.

관련 문제