Я новичок в указателе на класс. Я пишу простой код, чтобы показать свой вопрос.
Почему значение 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;
}
Если этот код действительно печатает 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()
может модифицировать "внешний" объект через свою локальную копию указателя.
Передача указателя на функцию похожа на передачу по ссылке. Я факт, что в основном, как ссылки работают под капотом.
Кроме того, у вас есть неопределенное поведение в вашем коде для обоих случаев. Когда вы объявляете локальную переменную, не присваивая ей одновременно, она является неопределенной, и использование этого значения для чего-либо не определено. Да, даже доступ к n.num
- это неопределенное поведение, что вы получаете значение 0
потому что это просто удача. И использование указателя, как вы, может даже привести к сбою программы.
f1(n);
n
передается копией. Следовательно, значение value не изменяется в main()
.
f2(p);
p
передается копией. Однако p
является указателем, и вы меняете значение на то место, где оно указывает. Поэтому значение, которое оно указывает, можно обновить и увидеть в main()
.
Не забудьте выделить память, где p
точек.
Node n;
Node *p;
p = &n;
Node*p; f2(p);
неопределенное поведение как есть. Вашp
нигде не указывает. Также используйте пробелы. Шутки в сторону. Код без пробелов трудно читать. Относительно того, почему значение может быть изменено через указатель: потому что так работает доступ к памяти. Вы захватываете адрес, разыменовываете его, записываете в память по этому адресу.p
является неопределенной . Это не имеет заявленной ценности. Использование его для оценки любым способом является неопределенным поведением .