То, почему мы не имеем два, аннулирует?

Массивы в C не имеют значения.

Везде, где ожидается значение объекта, но объектом является массив, вместо него используется адрес его первого элемента , с типом pointer to (type of array elements).

В функции все параметры передаются по значению (массивы не являются исключением). Когда вы передаете массив в функции, он «распадается на указатель» (sic); когда вы сравниваете массив с чем-то другим, снова он «распадается на указатель» (sic); ...

void foo(int arr[]);

Функция foo ожидает значение массива. Но в C массивы не имеют ценности! Таким образом, foo получает вместо этого адрес первого элемента массива.

int arr[5];
int *ip = &(arr[1]);
if (arr == ip) { /* something; */ }

В приведенном выше сравнении arr не имеет значения, поэтому он становится указателем. Он становится указателем на int. Этот указатель можно сравнить с переменной ip.

В синтаксисе индексирования массива, который вы используете для просмотра, снова arr «разлагается на указатель»

arr[42];
/* same as *(arr + 42); */
/* same as *(&(arr[0]) + 42); */

Единственный раз, когда массив не распадается на указатель, это когда он является операндом оператора sizeof, или & amp; оператор («адрес оператора») или как строковый литерал, используемый для инициализации массива символов.

31
задан GEOCHET 26 February 2009 в 16:48
поделиться

27 ответов

В моем программировании я недавно принял практику дифференцирующегося "пустого указателя языка" и "доменного пустого указателя".

"пустой указатель языка" является специальным значением, которое обеспечивается языком программирования для выражения, что переменная не имеет "никакого значения". Это необходимо как фиктивное значение в структурах данных, списках параметров и возвращаемых значениях.

"доменный пустой указатель" является любым количеством объектов, которые реализуют шаблон разработки NullObject . На самом деле у Вас есть один отличный доменный пустой указатель для каждого доменного контекста.

программистам довольно свойственно использовать пустой указатель языка в качестве всеобъемлющего доменного пустого указателя, но я нашел, что это имеет тенденцию делать код более процедурным (менее объектно-ориентированный) и намерение тяжелее для различения.

Каждый раз для желания пустого указателя спросите себя: это - пустой указатель языка или доменный пустой указатель?

34
ответ дан 27 November 2019 в 21:21
поделиться

Два пустых указателя были бы самым неправильным ответом вокруг. Если один пустой указатель недостаточно, Вам нужна бесконечность, аннулирует.

Пустой указатель Мог означать:

  • 'Неинициализированный'
  • 'Пользователь не определил'
  • 'Не Применимый здесь, цвет автомобиля, прежде чем это было нарисовано'
  • 'Единица: Этот домен имеет нулевые биты информации'.
  • 'Пустой: это правильно не содержит данных в этом случае, например, в прошлый раз, когда шины были повернуты на новом автомобиле'
  • 'Несколько, Расположение каскадом аннулирует: например, расширение цены количества, когда никакое количество не может быть требуемым временем количество, которое не было определено пользователем так или иначе'

И Ваш конкретный домен, возможно, нуждается во многих других видах 'из полосы' значения. Действительно, эти значения находятся в домене и должны иметь четко определенное значение в каждом случае. (следовательно, бесконечность действительно является нулем)

0
ответ дан 27 November 2019 в 21:21
поделиться

VB6

  • Ничто => "Нет никакого значения".
  • Пустой указатель => "Я не знаю то, что значение" - То же как DBNull. Значение в.NET
0
ответ дан 27 November 2019 в 21:21
поделиться

Можно всегда создавать объект и присваивать его тому же статическому полю для получения 2-го пустого указателя.

, Например, это используется в наборах, которые позволяют элементам быть пустыми. Внутренне они используют private static final Object UNSET = new Object, который используется в качестве значения сброса и таким образом позволяет Вам хранить null с в наборе. (Как я вспоминаю, платформа набора Java называет эту объектную НАДГРОБНУЮ ПЛИТУ вместо СБРОСА. Или была платформа набора этого Smalltalk?)

0
ответ дан 27 November 2019 в 21:21
поделиться

Для меня пустой указатель представляет отсутствие значения, и я пытаюсь использовать его только для представления этого. Конечно, можно дать пустой указатель как многие значения как Вам угодно точно так же, как можно использовать 0 или-1 для представления ошибок вместо их численных значений. Предоставление различных значений к одному представлению могло быть неоднозначным, хотя, таким образом, я не рекомендую это.

Ваши примеры могут быть кодированы как apple.isRefused () или! apple.isValid () с небольшой работой; необходимо определить заранее, что является недопустимым яблоком так или иначе, таким образом, я не вижу усиление наличия большего количества ключевых слов.

0
ответ дан 27 November 2019 в 21:21
поделиться
AppleInformation appleInfo;    
while (appleInfo is null)
{
    askForAppleInfo();
}

Apple apple = appleInfo.apple;
if (apple is null)
{
    sulk();
}
else
{
    eatApple(apple);
}

Первый Вы проверяете, есть ли у Вас информация о яблоке, позже Вы проверяете, существует ли яблоко или нет. Вы не нуждаетесь в другой поддержке родного языка этого, просто используете правильные классы.

0
ответ дан 27 November 2019 в 21:21
поделиться

Если Вы используете.NET 3.0 + и нуждаетесь в чем-то еще, Вы могли бы попробовать , Возможно, Монада . Вы могли создать то, что, "Возможно", вводит Вас потребность и, с помощью синтаксиса LINQ, процесс соответственно.

0
ответ дан 27 November 2019 в 21:21
поделиться

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

0
ответ дан 27 November 2019 в 21:21
поделиться

Я думаю, имея один ПУСТОЙ УКАЗАТЕЛЬ, более низкий общий знаменатель для контакта с основным шаблоном

if thing is not NULL
  work with it
else
  do something else

В, "делают что-то еще" часть, существует широкий спектр возможностей от "хорошо, забывает это" к попытке получить "вещь" где-то в другом месте. Если Вы просто не игнорируете что-то, что это является ПУСТЫМ, вероятно, необходимо знать, почему "вещь" была ПУСТОЙ. При наличии нескольких типов ПУСТОГО УКАЗАТЕЛЯ, помог бы Вам отвечающий на тот вопрос, но возможные ответы являются многочисленными, как подсказал в других ответах здесь. Недостающей вещью могла быть просто ошибка, это могла быть ошибка при попытке получить его, это не может быть доступно прямо сейчас и так далее. Для решения, какие случаи относятся коду - что означает, необходимо обработать их - конкретная IT-область. Таким образом, лучше использовать определенный механизм приложения для кодирования этих причин вместо того, чтобы найти функцию языка, которая пытается иметь дело со всеми ними.

0
ответ дан 27 November 2019 в 21:21
поделиться

Данный, сколько времени это взяло Западную философию, чтобы выяснить, как было возможно говорить о понятии "ничего"... Да, я не слишком удивлен, что различие было пропущено некоторое время.

1
ответ дан 27 November 2019 в 21:21
поделиться
boolean getAnswer() throws Mu
1
ответ дан 27 November 2019 в 21:21
поделиться

Некоторые люди уже на шаг впереди Вас.;)

1
ответ дан 27 November 2019 в 21:21
поделиться

Это попробовали: Visual Basic 6 не имел Ничего, Пустого указателя, и Пустой. И это привело к такому плохому коду, это показало в № 12 в легендарном Тринадцать Путей к статье Loathe VB в докторе Dobbs.

Использование шаблон Несуществующего объекта вместо этого, как другие предположили.

2
ответ дан 27 November 2019 в 21:21
поделиться

Некоторые люди будут утверждать, что мы должны быть избавлены от null в целом , который кажется довольно допустимым. В конце концов, почему остановка в два аннулирует? Почему не три или четыре и так далее, каждый представляющий "никакое значение" состояние?

Воображают это, с refused, null, invalid:

var apple;

while (apple is refused)
{
    askForApple();
}

if (apple is null)
{
    sulk();
}
else if(apple is invalid)
{
    discard();
}
else
{
    eatApple(apple);
}
2
ответ дан 27 November 2019 в 21:21
поделиться

В PHP, Строгом, необходимо сделать isset() проверка на переменные набора (или иначе она бросает предупреждение)

if(!isset($apple))
{
    askForApple();
}

if(isset($apple) && empty($apple))
{
    sulk();
}
else
{
    eatApple();
}
2
ответ дан 27 November 2019 в 21:21
поделиться

Проблема состоит в том, что на языке со строгим контролем типов эти дополнительные пустые указатели, как ожидают, будут содержать определенную информацию о типе.

В основном Ваш дополнительный пустой указатель является в некотором роде метаинформацией, метаинформация, которая может зависеть от типа.

Некоторые типы значения имеют эту дополнительную информацию, например, много числовых типов имеют постоянный NaN.

На динамически типизированном языке необходимо объяснить различие между ссылкой без значения (пустой указатель) и переменной, где тип мог быть чем-либо (неизвестный или неопределенный)

Так, например, в C# со статическим контролем типов переменная типа String может быть пустой, потому что это - ссылочный тип. Переменная типа Int32 не может, потому что это - тип значения, это не может быть пустым. Мы всегда знаем тип.

В JavaScript с динамическим контролем типов тип переменной можно оставить неопределенным, в этом случае различие между нулевой ссылкой и неопределенным значением необходимо.

1
ответ дан 27 November 2019 в 21:21
поделиться

В .NET langages, можно использовать nullable типы , которые решают эту проблему для типов значения.

проблема остается, однако, для ссылочных типов. С тех пор нет такой вещи как указатели в .NET (по крайней мере, в 'безопасных' блоках), "возразите? o" не скомпилирует.

2
ответ дан 27 November 2019 в 21:21
поделиться

Относительно то, почему мы не имеем два, аннулирует, снижается на это к тому, что, исторически в C, ПУСТОЙ УКАЗАТЕЛЬ был простым #define и не отличная часть языка вообще?

2
ответ дан 27 November 2019 в 21:21
поделиться

Пустой тип является подтипом всех ссылочных типов - можно использовать пустой указатель вместо ссылки на любой тип объекта - который сильно ослабляет систему типов. Это считает одним из исторически плохая идея ее создатель и только существует как проверяющий, является ли адрес нулем, легко реализовать.

2
ответ дан 27 November 2019 в 21:21
поделиться

Почему остановка в два?

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

3
ответ дан 27 November 2019 в 21:21
поделиться

Примечание null является приемлемым, все же известным условием. Неизвестное состояние является другой вещью IMO. Мой разговор с Dan в разделе комментариев лучшей публикации разъяснит мое положение. Спасибо Dan!.

то, Что Вы, вероятно, хотите запросить, - был ли объект инициализирован или нет.

Actionscript имеет такую вещь (null и undefined). С некоторыми ограничениями как бы то ни было.

См. документация :

тип данных void

тип данных void содержит только одно значение, неопределенное. В предыдущих версиях ActionScript, неопределенного, было значение по умолчанию для экземпляров Класса объекта. В ActionScript 3.0 значение по умолчанию для Экземпляров объектов является пустым. При попытке присвоить значение, неопределенное экземпляру Класса объекта, то Flash player или Adobe AIR преобразуют значение в пустой указатель. Можно только присвоить значение неопределенных к переменным, которые не вводятся. Нетипизированные переменные являются переменными, что или испытать недостаток в любой аннотации типа, или используют звездочку (*) символ для аннотации типа. Можно использовать пусто только в качестве аннотации типа возврата.

2
ответ дан 27 November 2019 в 21:21
поделиться

Было бы достаточно легко создать статическое постоянное неизвестное указание для редких случаев при необходимости в такой вещи.

var apple = Apple.Unknown;
while (apple == Apple.Unknown) {} // etc
11
ответ дан 27 November 2019 в 21:21
поделиться

Существование значения:

  • Python: vars().has_key('variableName')
  • PHP: isset(variable)
  • JavaScript: typeof(variable) != 'undefined'
  • Perl: (variable != undef) или если Вы желаете: (defined variable)

, Конечно, когда переменная является неопределенной, это не ПУСТОЕ

7
ответ дан 27 November 2019 в 21:21
поделиться

JavaScript на самом деле имеет и пустой и неопределенный ( http://www.w3schools.com/jsref/jsref_undefined.asp ), но много других языков не делают.

11
ответ дан 27 November 2019 в 21:21
поделиться

В haskell можно определить что-то вроде этого:

data MaybeEither a b = Object a
                     | Unknown b
                     | Null
                       deriving Eq
main = let x = Object 5 in
       if x == (Unknown [2]) then putStrLn ":-("
       else putStrLn ":-)"

идея, являющаяся, что Неизвестные значения содержат некоторые данные типа b, который может преобразовать их в известные значения (как Вы сделали бы, который зависит от конкретных типов a и b).

соблюдающий читатель отметит, что я просто объединяюсь, Возможно, и Любой в один тип данных:)

2
ответ дан 27 November 2019 в 21:21
поделиться

Не достаточно плохо, который мы имеем один пустой указатель?

39
ответ дан 27 November 2019 в 21:21
поделиться

На большинстве языков программирования пустой указатель означает "пустой" или "неопределенный". "Неизвестный", с другой стороны, что-то другое. В сущности "неизвестный" описывает состояние объекта. Это состояние, должно быть, прибыло из куда-нибудь в Вашей программе.

Взглянули на шаблон Несуществующего объекта . Может помочь Вам с тем, чего Вы пытаетесь достигнуть.

34
ответ дан 27 November 2019 в 21:21
поделиться
Другие вопросы по тегам:

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