Во-первых, мы не «добавляем символ NULL» в конец строки. Там нет такой вещи, как "NULL персонаж". Мы добавляем ноль символ, который иногда называют "символом NUL". Но NULL
не имеет к этому никакого отношения. NULL
обычно используется в контексте указателя, а не в символьном или целочисленном контексте. Ваши сравнения типа *myCharPtr != NULL
или *myIntPtr != NULL
будут компилироваться (из-за способа определения NULL
в C ++), но практически не имеют смысла. Если вы ищете нулевой символ в массиве, вы можете проверить его как *myCharPtr != '\0'
или *myCharPtr != 0
или просто *myCharPtr
, но никогда не *myCharPtr != NULL
.
Во-вторых, нулевой символ называется нулевым символом по причине: он равен целому нулю. Тип символа в C ++ - это всего лишь простой целочисленный тип. Единственная причина, по которой мы можем использовать нулевой символ как нечто особенное в строковом контексте, заключается в том, что его значение зарезервировано для этой конкретной цели. В общем случае в целочисленном контексте резервирование нуля для этой цели явно невозможно по очевидным причинам: ноль так же полезен, как и любое другое целочисленное значение. Тем не менее, если в вашем конкретном приложении целое число ноль можно использовать как зарезервированное значение, не стесняйтесь использовать его таким образом. Или вы можете использовать любое другое целочисленное значение для этой цели. Но в общем случае, ссылаясь на вопрос, который вы задаете в заголовке, никак не может определить конец массива. Вы обязаны знать, где находится конец (зная общее количество элементов или пометив конец зарезервированным значением по вашему выбору или каким-либо другим способом). Нет никакого способа определить конец массива даже со строками, потому что все, на что вы можете надеяться, это найти конец строки , которая не обязательно является концом массива, в котором хранится эта строка.
Если вы явно добавили ноль в конец массива целых чисел, ваш первый цикл с радостью остановится на этом. По какой-то причине вы явно добавили \0
в конце массива символов (и второй цикл останавливается), но вы не добавили ноль в конце массива целых чисел (и первый цикл не останавливается). Вы задаетесь вопросом, почему ваш первый цикл не остановился на нуле? Потому что ты не поставил этот ноль там. Это так просто.