C ++ char * Confusion [duplicate]

Angular1

Для людей, которые используют AngularJS , может справиться с этой ситуацией, используя Promises.

Здесь it говорит,

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

blockquote>

Вы можете найти приятное объяснение здесь .

Пример, найденный в docs , упомянутом ниже.

  promiseB = promiseA.then(
    function onSuccess(result) {
      return result + 1;
    }
    ,function onError(err) {
      //Handle error
    }
  );

 // promiseB will be resolved immediately after promiseA is resolved 
 // and its value will be the result of promiseA incremented by 1.

Angular2 and Later

In Angular2, посмотрите на следующий пример, но его рекомендовал использовать Observables с Angular2.

 search(term: string) {
     return this.http
  .get(`https://api.spotify.com/v1/search?q=${term}&type=artist`)
  .map((response) => response.json())
  .toPromise();

}

Вы можете использовать это таким образом,

search() {
    this.searchService.search(this.searchField.value)
      .then((result) => {
    this.result = result.artists.items;
  })
  .catch((error) => console.error(error));
}

См. здесь оригинал . Но TypScript не поддерживает native es6 Promises , если вы хотите его использовать, для этого вам может понадобиться плагин.

Кроме того, здесь представлены обещания spec определите здесь.

40
задан Garrett 8 July 2014 в 05:19
поделиться

5 ответов

«hello» - это строка, то есть массив символов. const char* является указателем на этот массив, поэтому, когда вы разыгрываете этот указатель, вы получаете значение первого элемента.

Как будто у вас есть

int a[] = {1, 2, 3};
int *b = a;
cout << *b << endl;

, вы просто напечатайте 1.

-1
ответ дан Ivan Smirnov 26 August 2018 в 02:26
поделиться

Оператор << на std::cout перегружен. Его поведение зависит от типа правильного операнда. (Это фактически несколько разных функций, все названы operator<<, компилятор решает, какой из них вызывать.)

Если вы дадите ему char* или const char*, он обрабатывает операнд как указатель на (первый символ) строки C-стиля и печатает содержимое этой строки:

const char * terry = "hello";
cout << terry; // prints "hello"

Если вы даете ему значение char, оно печатает это значение как символ:

cout << *terry;   // prints "h"
cout << terry[0]; // the same

Если вы указали ему указатель типа void*, он печатает это значение указателя (в определенном порядке реализации, обычно шестнадцатеричном):

cout << static_cast<const void*>(terry); // prints something like 0x4008e4

Обработка char* или const char* как указатель на строку C-стиля - это особый случай, и единственное, что я могу придумать, которое вызывает operator<< для печати чего-то другого, кроме значения операнда. Причина этого восходит к корням C ++ в C, который не имеет типа «string» и манипулирует строками с помощью указателей char*.

Существует множество других перегрузок для operator<<, для различных целочисленные и числовые типы с плавающей запятой, для std::string и т. д.

14
ответ дан Keith Thompson 26 August 2018 в 02:26
поделиться

Причиной этого является то, что std::cout будет обрабатывать char * как указатель на (первый символ) строки стиля C и печатать его как таковой. Если вы хотите использовать адрес , вы можете просто передать его указателю, который не был обработан таким образом, например:

cout << (void *) terry;

(или используйте бросок const void *, если вы беспокоитесь о том, чтобы отбросить созвездие, что-то, что не является проблемой в данном конкретном случае).


Если вы скорее пурист, чем прагматик, вы также можете использовать C ++ static_cast по строкам:

cout << static_cast <const void *> (terry);

, хотя в этом конкретном случае это необязательно, приведение к void * будет работать нормально. Следующий пример кода показывает все эти параметры в действии:

#include <iostream>
int main (void) {
    const char *terry = "hello";
    std::cout << terry << '\n';
    std::cout << (void *) terry << '\n';
    std::cout << (const void *) terry << '\n';
    std::cout << static_cast<const void *> (terry) << '\n';
    return 0;
}

вывод (адрес может быть другим в вашей среде):

hello
0x8048870
0x8048870
0x8048870

Обратите внимание, что при использовании кнопки static_cast, вы должны убедиться, что вы не пытаетесь отбросить константу с помощью static_cast <void *> (это для const_cast). Это одна из проверок, выполненных более новыми C ++-переходами, и старинный стиль не имеет этого ограничения.

58
ответ дан paxdiablo 26 August 2018 в 02:26
поделиться

cout перегружен, так что, когда вы даете ему char *, он будет печататься как указатель на строку стиля C. Таким образом, он печатает символы до тех пор, пока не ударит нулевой завершающий символ.

Если вы использовали printf вместо cout, вы увидите адрес. Вы также можете направить указатель на другой тип, скажем (void *), и вы также получите адрес.

1
ответ дан Richard Fung 26 August 2018 в 02:26
поделиться

Вы должны изменить свой код на это:

cout << static_cast<const void*>(terry);

Проблема в том, что оператор << перегружен для указателей на строки C-стиля для печати содержимого строки. Если вы вместо этого нарисуете его на необработанный указатель, вы будете иметь поведение по умолчанию для указателя печати, используя iostreams, как вы хотите.

8
ответ дан sasha.sochka 26 August 2018 в 02:26
поделиться
Другие вопросы по тегам:

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