2016-10-19 2 views
1

В основном, мой вопрос заключается в том, что, когда я запускаю эти два сегмента кода, я получаю разные адреса памяти. Первый сегмент кода дает определенный адрес памяти для rValue, а второй дает другой адрес памяти для rValue, просто добавив оператор &. Почему это происходит?Почему я получаю разные адреса памяти для указателя, переданного функции?

#include <iostream> 
using namespace std; 


int pMem(int *rValue){ 

cout << "Value of rValue is " << *rValue << endl;; 
cout << "Address of rValue is " << rValue << endl; 
*rValue = 15; 
cout << "Value of rValue now is " << *rValue << endl; 
cout << "Address of rValue is " << rValue << endl; 

return *rValue; 

} 

int main() { 


int value = 8; 
int *pValue = &value; 

pMem(&value); 



cout << "Value = " << value << endl; 
cout << "Address of Value: " << pValue << endl; 
cout << "Value at memory address " << pValue << ": " << *pValue << endl; 


return 0; 
} 

второй блок кода, на этот раз с & RValue ... Я получаю разные адреса памяти, чем первый блок кода.

#include <iostream> 
using namespace std; 


int pMem(int *rValue){ 

cout << "Value of rValue is " << *rValue << endl;; 
cout << "Address of rValue is " << &rValue << endl; 
*rValue = 15; 
cout << "Value of rValue now is " << *rValue << endl; 
cout << "Address of rValue is " << &rValue << endl; 

return *rValue; 

} 

int main() { 


int value = 8; 
int *pValue = &value; 

pMem(&value); 



cout << "Value = " << value << endl; 
cout << "Address of Value: " << pValue << endl; 
cout << "Value at memory address " << pValue << ": " << *pValue << endl; 


return 0; 

}

+1

& rValue принимает указатель на rValue. Указатель на указатель не равен самому указателю. – mascoj

+0

Я спрашиваю, почему я получаю другой адрес памяти, когда я запускаю первый сегмент против, когда я запускаю второй сегмент. –

ответ

3

Даже указатели сами занимают память и есть адрес, связанный с ними.

So & rValue - это адрес указателя rValue, и если он не является указателем на функцию, этот адрес будет отличаться.

+0

Отлично, спасибо, сэр! –

2

Причина этого поведения заключается в том, что указатели передаются по значению. Другими словами, если ваша функция принимает параметр rValue указатель типизированных как этот

int pMem(int *rValue) 

C++ выделяет пространство для совершенно новой переменной типа int*, в комплекте со своим собственным адресом в памяти. Эта переменная инициализируется из выражения указателя, которое вы передаете pMem. Кроме этого, это отдельная переменная, которая ведет себя как локальная переменная до pMem. В частности, любые перераспределения самого параметра не влияют на вызывающего.

Это адрес этой переменной параметра, который печатается, когда вы это делаете:

cout << &pValue << endl; // Prints a new address 

Если вы хотите, чтобы увидеть адрес, который передается функции, печать указателя, а не адрес это:

cout << pValue << endl; // Prints the address that you passed 
Смежные вопросы