C ++ мы можем вывести адрес памяти структуры? - PullRequest
0 голосов
/ 06 июня 2018

Я снова озадачен.Пожалуйста, не запрещайте мне задавать вопросы, если я могу получить подтверждение или ответы на свои вопросы, я могу узнать больше, и я буду признателен за это.Я просмотрел переполнение стека, и есть много вопросов, похожих на те, что я задавал, но они не помогают мне.Примечание. Вы можете скопировать и вставить приведенный ниже код здесь https://www.tutorialspoint.com/compile_cpp_online.php, и он будет работать.Я уверен, что мои вопросы просты для эксперта.

// --------------------------------------------------

#include <cstdlib>
#include <iostream>

using namespace std;

struct Node
{
  int data;
  Node *link;
};

struct CDAccount
{
    double balance;
    double interest;
    int term;
};

void get_data(CDAccount& the_account);
void head_insert(Node* &head, int the_number);
void changeArray(int array[]);
Node* search(Node* head, int target); // return type is an address in 
//memory, where the address points to some Node.

int main(int argc, char *argv[]){

//Array demonstration.
int x[10] = {1,2,3,4,5,6,7,8,9,10};
for (int i=0; i<10; i++){
    cout << x[i] << endl;
    cout << x + i << endl;
}

cout <<endl << endl;
changeArray(x);
for (int i=0; i<10; i++){
    cout << x[i] << endl;
    cout << x + i << endl;
}

cout<< endl << endl;
Node* head = new Node; // head points to some Node.
cout << head << " pointing to some new Node containing 5 and new Node (see next lines)"<< endl << endl;
//cout << &head->data << endl; Same address as above.

(*head).data = 5; // head data content is 5.
(*head).link = new Node; // head pointer content points to 2nd Node.
cout << head->data << endl;
cout << head->link << endl << endl;

//(*((*head).link)).data = 20;
head->link->data = 20; // same as line before.
head->link->link = new Node;
cout << head->link->data << endl;
cout << head->link->link << endl << endl;


head->link->link->data = 25;
head->link->link->link = NULL;
cout << head->link->link->data << endl;
cout << head->link->link->link << endl << endl;

Node* found = search(head, 20);
cout<<"Target is at this address: " << found<<endl<<endl;
if(found != NULL){
cout<<(*found).data<<endl;
cout<<(*found).link<<endl; 
}


CDAccount account;
account.balance = 100;
cout << account.balance << endl;
// SAME...
cout << &account <<endl; 
cout << &account.balance<< endl;
// SAME...
cout << x << endl;
cout << &x[0] << endl;

//cout << account << endl; //WON'T WORK, WHY?
get_data(account);
cout << account.balance << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

void head_insert(Node* &head, int the_number)
{
    Node* temp_ptr;
    temp_ptr = new Node;
    temp_ptr->data = the_number;
    temp_ptr->link = head;
    head = temp_ptr;
}

void get_data(CDAccount& the_account){
    cout << "Inside function : " << &the_account << endl;
    the_account.balance = 100000;
    the_account.interest = 0.02;
    the_account.term = 12;
}

void changeArray(int array[]){
    array[2] = 7;
    array[3] = 101;
}

Node* search(Node* head, int target)
{
   Node* here = head;
   if (here == NULL)
      {
         return NULL;
      }
   else
      {
         while (here->data != target && here->link != NULL)
            here = here->link;
         if (here->data == target)
            return here;
         else
            return NULL;
      }
}

// --------------------------------------------------

В нашей программе x - это массив, и в основном x [0], x [1], x [2] являются членами данных.Я могу сделать cout << x << endl;, и моя программа скомпилируется, и она просто покажет мне адрес памяти, и он указывает на x [0].Но почему не работает cout << account << endl;?Разве я не вижу адрес памяти?В частности, учетная запись указывает на первый элемент данных - это account.balance, верно?В PHP мне приходилось передавать массив по ссылке, чтобы он менялся вне функции, что еще больше смущает меня.Почему я не должен делать это в C ++, в то время как это должно быть сделано для структуры?... Так почему я не могу распечатать адрес памяти структуры?Я даже могу распечатать адрес памяти head, который является узлом *.

Так почему тип структуры передается по ссылке?the_account - это структура.Так же и массив.Тем не менее, мы передаем массивы без ссылки (&) и массив изменяется вне функции.Разве учетная запись не является просто адресом, который указывает на элементы данных, как массив ...?Это смущает меня.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

В C ++ есть как указатели, так и ссылки.Причина этого в том, что указатели существовали первыми, а ссылки добавлялись позже.

Когда вы печатаете массив, во многих языках он печатает все элементы.Это то, что люди обычно хотят делать.В C ++ cout << array печатает адрес памяти, потому что массивы обрабатываются как указатели.array распадается на указатель на первый элемент, &array[0].

Когда вы передаете объект (фактически ссылку) в cout, возникает ошибка компиляции, потому что компилятор не знает, что вы хотитепечатать.Он не преобразует объект автоматически в адрес памяти, потому что большинство людей не хотят его печатать.

Вы можете напечатать адрес памяти объекта с помощью cout << &account.Чтобы заставить cout << account работать, вам нужно реализовать оператор << для класса:

ostream& operator<<(ostream& out, const CDAccount& account) {
    // Print memory address
    return out << &account;

    // Or print something else
    // return out << "Account balance: " << account.balance;
}
0 голосов
/ 06 июня 2018

Вы не можете напечатать account, используя cout<<, потому что 'cout' не знает, как его распечатать.Вы должны определить функцию, которая сообщает cout, что вы хотите напечатать из этого account объекта.В этом случае вам нужно friend fuction.Перед этим вы можете сделать следующее: cout<<accout:

class CDAccount
{
public: //or private or protected
  double balance;
  double interest;
  int term;
  friend ostream& operater<<(ostream&out, const CDAccount& account)
  {
     //print infor of account object
     return out<<account.balance<<" "<<account.interest<<" "account.term;
  }
};

Мне кажется, эта ссылка для вас более понятна: https://www.tutorialspoint.com/cplusplus/cpp_friend_functions.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...