Почему указатель на класс может изменить значение с помощью вызова функции?

0

Я новичок в указателе на класс. Я пишу простой код, чтобы показать свой вопрос.
Почему значение p-> num установлено в f2? Указатель p не похож на n? Просто локальная переменная?
Разве только области n1 и p2 существуют только в f1 и f2 отдельно? благодаря
В чем разница между ними!

class Node{
public:
   int num;
   Node* next;
};

void f1(Node n1){
   n1.num = 50;
}
void f2(Node*p2){
   p2->num= 100;
}
int main(){     
   Node n;
   f1(n);
   cout<<n.num<<endl;//output 0

   Node*p;
   f2(p);
   cout<<p->num<<endl;//output 100
   return 0;    
}
  • 1
    Node*p; f2(p); неопределенное поведение как есть. Ваш p нигде не указывает. Также используйте пробелы. Шутки в сторону. Код без пробелов трудно читать. Относительно того, почему значение может быть изменено через указатель: потому что так работает доступ к памяти. Вы захватываете адрес, разыменовываете его, записываете в память по этому адресу.
  • 0
    Потому что вы вызываете неопределенное поведение. Может случиться все, что угодно (я только хочу, чтобы что- нибудь, в том числе и мой дом, как-нибудь рисовало). Переданная переменная p является неопределенной . Это не имеет заявленной ценности. Использование его для оценки любым способом является неопределенным поведением .
Показать ещё 2 комментария
Теги:
pointers
function

3 ответа

1
Лучший ответ

Если этот код действительно печатает 100 для вас, вам очень повезло (или не повезло, на основе точки зрения). Там проблема в том, что p не указывает ни на что, поэтому, когда вы пишете через нее, вы пишете в случайную память. Вы должны инициализировать его, возможно, так:

int main(){     
   Node n;
   f1(n);
   cout<<n.num<<endl;//output 0

   Node *p = &n;  //now 'p' will point to the Node object 'n'
   f2(p);
   cout<<p->num<<endl;//output 100
   return 0;    
}

Это также может помочь ответить на ваш основной вопрос: указатель указывает на существующий объект. Это означает, что хотя p2 действительно локально в f2(), это копия указателя p из main(). И они оба указывают на один и тот же объект (объект n в моей модификации), поэтому f2() может модифицировать "внешний" объект через свою локальную копию указателя.

2

Передача указателя на функцию похожа на передачу по ссылке. Я факт, что в основном, как ссылки работают под капотом.

Кроме того, у вас есть неопределенное поведение в вашем коде для обоих случаев. Когда вы объявляете локальную переменную, не присваивая ей одновременно, она является неопределенной, и использование этого значения для чего-либо не определено. Да, даже доступ к n.num - это неопределенное поведение, что вы получаете значение 0 потому что это просто удача. И использование указателя, как вы, может даже привести к сбою программы.

  • 0
    Вы думаете, что тот, кто не понимает указатели, понимает ссылки?
  • 2
    * как ссылки эмулируются в C. (поскольку C не имеет ссылок.)
1
f1(n);

n передается копией. Следовательно, значение value не изменяется в main().

f2(p);

p передается копией. Однако p является указателем, и вы меняете значение на то место, где оно указывает. Поэтому значение, которое оно указывает, можно обновить и увидеть в main().

Не забудьте выделить память, где p точек.

Node n;
Node *p;
p = &n;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню