2014-10-13 6 views
2

новичок вопрос здесь, может ли кто-нибудь дать ответ на вопрос, почему этот цикл не заканчивается? Я переписываю адрес переменной, затем де-ссылку на нее и добавляю ее к ней. По моей логике он должен заканчиваться на 10-м шаге.Почему моя петля не заканчивается?

Спасибо!

#include <iostream> 


using namespace std; 

int addtoi(int intern); 

int main(){ 

    for(int i = 0; i < 10;addtoi(i)){ 



    } 

} 

int addtoi(int intern){ 

    int *pt; 

    pt = &intern; 

    ++*pt; 
    cout << *pt << "\t" << intern << "\n"; 

    return 0; 
} 
+0

Прежде всего, вы действительно не изменяете значение 'i' в вашем методе' addtoi'. Во-вторых, вам нужно передать 'i' в качестве ссылки или сделать его указателем, чтобы изменения внутри метода отражались вне его. – nem035

+0

Спасибо, я только что понял, что глупая ошибка :) –

+0

Когда вы передаете' i' в ваша функция делает *** копию ***, которую он использует внутри функции. Вам нужно передать * reference * или передать указатель на 'i'. – Galik

ответ

4

Ваш цикл не прекращается, так как любые изменения, внесенные вами в intern внутри addtoi оставаться внутри addtoi. Тот факт, что вы берете указатель там, не действует, потому что уже слишком поздно: вы берете указатель на локальную переменную, которая передана в i.

Вы можете исправить это, пройдя intern по ссылке , как это:

int addtoi(int& intern) { 
    intern++; 
    cout << intern << "\n"; 
    return 0; 
} 

Вам не нужно брать его адрес - просто изменяя это изменит значение i внутри цикла.

+0

Спасибо, я исправил его, и он работает. –

3

Вы не изменяете значение i в любом месте вашего цикла. Вы передаете его значение в addtoi, но значение не может изменить значение переменной, значение которой вы взяли. Так почему это когда-нибудь закончится?

Если вы передадите ссылку или указатель на i на номер addtoi, тогда это может изменить значение i. Но если вы передадите только значение, то оно может только изменить переданное ему значение, которое не влияет на значение i.

Что вы думаете, что произойдет, если вы сделали это:

addtoi(1); 

Как вы думаете, что постоянная 1 бы как-то изменить? То же самое - если вы передадите значение, вы не можете ничего изменить в вызывающем, поскольку все, что вы получили, было значением.

Рассмотрим:

int j = 1; 
int i = 1; 
addtoi(i); 
addtoi(j); 
addtoi(1); 

Эти три вызова все проходят одинаковое значение для addtoi 1. Не имеет значения, как вы получить это значение, если все, что вам передать это значение.

+0

Ничего себе, большое вам спасибо, эта глупая ошибка просто показывает, насколько я новый для указателей! –

1

Цикл не заканчивается, потому что когда вы делаете addtoi(i), значение i отправляется функции addtoi(), а не оригинальной переменной i. Это классический пример прохождения по значению.

Смежные вопросы