Я пытаюсь изучить C++ самостоятельно, используя Jesse Liberty, «Обучайте себя C++ за 24 часа». Я написал эту короткую программу для определения указателей на C++.Попытка понять указатели в C++
#include <iostream>
void hMany(int count); // hMany function prototype
void hMany(int count){
do {
std::cout << "Hello...\n";
count--;
} while (count >0);
};
int main (int argc, const char * argv[]) {
int counter;
int * pCounter = &counter;
std::cout << "How many hellos? ";
std::cin >> counter;
hMany(*pCounter);
std::cout << "counter is: " << counter << std::endl;
std::cout << "*pCounter is: " << *pCounter << std::endl;
return 0;
}
Полученный результат:
How many hellos? 2
Hello...
Hello...
counter is: 2
*pCounter is: 2
Какая польза от прохождения указатели (*) pCounter против аргумента (счетчик)?
Любая помощь была бы принята с благодарностью. Луис
Update:
Ok. Программа работает, и теперь я полностью понимаю указатели на C++. Спасибо всем за ваши ответы. Пробовав код Чолетта, я получил 2 предупреждения (а не ошибки). Один был! Нет предыдущего прототипа функции hMany и * pCount--! Результат выражения не используется. Я смог исправить прототип самостоятельно, но я не мог понять предупреждение * pCount.
Я попросил моего друга Тони получить помощь, и вот его ответ.
Скобки делают вещи в правильном порядке.
(*pCount)--
говорит следовать указатель на целое число он указывает, а затем уменьшаем число, которое является то, что вы хотите сделать.
*pCount--
заканчивает тем, что делает не то, что компилятор воспринимает его как
*(pCount—)
, который говорит уменьшает указатель первым, оставив его, указывая на «целое», прежде чем тот, который вы хотите изменить (нет такой вещи, поскольку у вас есть только одно целое, с которым вы вызывали эту функцию), затем следуйте этому декрементированному указателю и ничего не делайте с целым числом в этой ячейке памяти. Вот почему компилятор жаловался, что результат выражения не использовался. Компилятор был прав. Этот код неправильно уменьшает указатель, извлекает неправильное целое число и не сохраняет это неправильное целое в любом месте.
Вот правильный код для тех, кто не знаком с C++, который может быть заинтересован.
включаетнедействительного hMany (INT * pCount); // Функция hMany прототип
недействительными hMany (интермедиат * pCount) {// * pCount получает адрес графа
do {
std::cout << "Hello...\n";
// The parentheses make things happen in the correct order.
// says to follow the pointer to the integer it points to,
// and then decrement the integer.
(*pCount)--;
} while (*pCount >0);
}
INT основных (INT ARGC, Const символ * ARGV []) {
int counter;
int * pCounter = &counter;
std::cout << "How many hellos? ";
std::cin >> counter;
hMany(pCounter); // passing the address of counter
std::cout << "counter is: " << counter << std::endl;
std::cout << "*pCounter is: " << *pCounter << std::endl;
return 0;
}
_Pointers_ not _Points_. – deepmax
Пожалуйста, получите [* good * book] (http://stackoverflow.com/q/388242/1171191). 'C++' не является языком для изучения "за 24 часа". Вы просто изучите ужасные практики, которые трудно будет отучить и дадут вам плохое впечатление о языке. – BoBTFish
Я думаю, что ответы ниже отсутствуют. В коде выше никакие указатели не передаются функции. – john