Если у Вас есть параметр, где Вы, возможно, должны указать на отсутствие значения, это - обычная практика, чтобы сделать параметр значением указателя и передать в ПУСТОМ УКАЗАТЕЛЕ.
А лучшее решение в большинстве случаев (с точки зрения безопасности) состоит в том, чтобы использовать повышение:: дополнительный . Это позволяет Вам передавать в дополнительных значениях ссылкой и также как возвращаемое значение.
// Sample method using optional as input parameter
void PrintOptional(const boost::optional& optional_str)
{
if (optional_str)
{
cout << *optional_str << std::endl;
}
else
{
cout << "(no string)" << std::endl;
}
}
// Sample method using optional as return value
boost::optional ReturnOptional(bool return_nothing)
{
if (return_nothing)
{
return boost::optional();
}
return boost::optional(42);
}
Имя массива - это имя массива. Имя массива - это идентификатор, который идентифицирует весь объект массива. Это не указатель ни на что.
Когда имя массива используется в выражении, тип массива автоматически неявно конвертируется в тип указателя на элемент в почти во всех контекстах (это часто называют "распад типа массива"). Результирующий указатель - это полностью независимое временное rvalue. Это не имеет ничего общего с самим массивом. Это не имеет ничего общего с именем массива.
Двумя исключениями, когда неявное преобразование не происходит, являются: operator sizeof
и унарный оператор &
(address-of). Это именно то, что вы тестировали в своем коде.
Остерегайтесь типов.
myArray
- int [10]
. & myArray
- int (*) [10]
(указатель на int [10]
). myArray
будет int *
. Т.е. тип значения для myArray
- int *
. sizeof (myArray) == sizeof (int [10])! = Sizeof (int *)
. Следствие:
myArray
и & myArray
несовместимы типы указателей и не являются взаимозаменяемыми. Невозможно правильно присвоить & myArray
переменной типа int * foo
.
Массив не является указателем. Однако, если имя массива используется в выражении, где оно не является объектом ни оператора &
, ни оператора sizeof
, оно будет оценивать указатель на свой первый элемент.
arrayyname
будет указывать на все элементы массива. Это причина, по которой вы можете сделать
(arrayyname + 5)
, чтобы указать на 5-й элемент в массиве.
Нет, массив - это этот первый элемент (и остальное). Он не преобразуется в указатель, пока вы не передадите его в качестве аргумента функции.
Имя массива не является указателем, но его можно рассматривать как указатель на первый элемент массива.
do arrayyname ++, и вы узнаете, что имя массива одновременно представляет весь массив, а не только начальный элемент .... по умолчанию он сохраняет начальный адрес первого элемента