Это потому, что char *
- это немного особый случай.
В дни C char *
был единственным типом, с которым нам действительно приходилось иметь дело со строками. C++ упрощает взаимодействие с устаревшим кодом, предоставляя потоковые операторы, которые обрабатывают значения char *
специально, путем потоковой передачи каждого символа до тех пор, пока не встретится нулевой символ ('\0'
).
Когда вы обмениваетесь p
, когда это int *
, нет специального случая - вы просто получите отображаемое значение необработанного указателя.
Если вы хотите одну гильзу, чтобы отобразить элементы в стандартном контейнере, вы можете комбинировать std::copy()
с std::ostream_iterator
:
std::copy(std::begin(some_array),
std::end(some_array),
std::ostream_iterator<int>(std::cout));
Поскольку ваш массив выделяется в куче и хранится в указателе, std::begin()
и std::end()
не сработает для вас; Вы должны будете предоставить конечному итератор вручную: (. See a demo)
std::copy(p, p + 2, std::ostream_iterator<int>(std::cout));
Но обратите внимание, что оба образца кода в вашем вопросе не определено поведение, потому что вы выделить единый объект типа char
или int
, а затем попробуйте назначить за пределами. Вы записываете в память, которую вы не выделили. Не делайте этого.
Чтобы исправить свои дела, вам нужно выделить достаточно места для объектов, которые вы собираетесь хранить:
// Case one
char *p = new char[3];
// Case two
int *p = new int[2];
И, конечно же, не забудьте delete[] p
в обоих случаях - или вы могли бы просто используйте std::string
в первом случае и std::vector<int>
во втором.
Неопределенное поведение очевидно (и может привести к путешествию во времени) – quantdev
@quantdev Вы правы, но как я могу вывести все эффективные целочисленные значения в массиве без использования цикла? – SimaGuanxing
@JoeWang - это совсем другой вопрос. Но начните, посмотрев на ответ Барри о том, как безопасно распределить массив int (и если вы знаете размер раньше времени, оставайтесь в стороне от 'new int [3]' в первую очередь ... просто используйте 'int intsToOutput [3]; '). –