array/arrayname является не всегда указателем на первый элемент в C?

Если у Вас есть параметр, где Вы, возможно, должны указать на отсутствие значения, это - обычная практика, чтобы сделать параметр значением указателя и передать в ПУСТОМ УКАЗАТЕЛЕ.

А лучшее решение в большинстве случаев (с точки зрения безопасности) состоит в том, чтобы использовать повышение:: дополнительный . Это позволяет Вам передавать в дополнительных значениях ссылкой и также как возвращаемое значение.

// 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);
}

6
задан Chris_45 4 December 2009 в 08:20
поделиться

7 ответов

Имя массива - это имя массива. Имя массива - это идентификатор, который идентифицирует весь объект массива. Это не указатель ни на что.

Когда имя массива используется в выражении, тип массива автоматически неявно конвертируется в тип указателя на элемент в почти во всех контекстах (это часто называют "распад типа массива"). Результирующий указатель - это полностью независимое временное rvalue. Это не имеет ничего общего с самим массивом. Это не имеет ничего общего с именем массива.

Двумя исключениями, когда неявное преобразование не происходит, являются: operator sizeof и унарный оператор & (address-of). Это именно то, что вы тестировали в своем коде.

18
ответ дан 8 December 2019 в 03:01
поделиться

Остерегайтесь типов.

  • Тип myArray - int [10] .
  • Тип & myArray - int (*) [10] (указатель на int [10] ).
  • При оценке типом myArray будет int * . Т.е. тип значения для myArray - int * .
  • sizeof не оценивает свой аргумент. Следовательно, sizeof (myArray) == sizeof (int [10])! = Sizeof (int *) .

Следствие:

  • myArray и & myArray несовместимы типы указателей и не являются взаимозаменяемыми.

Невозможно правильно присвоить & myArray переменной типа int * foo .

5
ответ дан 8 December 2019 в 03:01
поделиться

Массив не является указателем. Однако, если имя массива используется в выражении, где оно не является объектом ни оператора & , ни оператора sizeof , оно будет оценивать указатель на свой первый элемент.

4
ответ дан 8 December 2019 в 03:01
поделиться

arrayyname будет указывать на все элементы массива. Это причина, по которой вы можете сделать (arrayyname + 5) , чтобы указать на 5-й элемент в массиве.

1
ответ дан 8 December 2019 в 03:01
поделиться

Нет, массив - это этот первый элемент (и остальное). Он не преобразуется в указатель, пока вы не передадите его в качестве аргумента функции.

3
ответ дан 8 December 2019 в 03:01
поделиться

Имя массива не является указателем, но его можно рассматривать как указатель на первый элемент массива.

0
ответ дан 8 December 2019 в 03:01
поделиться

do arrayyname ++, и вы узнаете, что имя массива одновременно представляет весь массив, а не только начальный элемент .... по умолчанию он сохраняет начальный адрес первого элемента

0
ответ дан 8 December 2019 в 03:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: