Что ** в C++?

Я использую следующую функцию для публикации данных с помощью curl. $ data - это массив полей для публикации (будет корректно закодирован с использованием http_build_query). Данные кодируются с помощью application / x-www-form-urlencoded.

function httpPost($url, $data)
{
    $curl = curl_init($url);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}

@Edward упоминает, что http_build_query может быть опущен, поскольку curl будет правильно кодировать массив, переданный параметру CURLOPT_POSTFIELDS, но имейте в виду, что в этом если данные будут закодированы с использованием multipart / form-data.

Я использую эту функцию с API-интерфейсами, которые ожидают, что данные будут закодированы с использованием application / x-www-form-urlencoded. Вот почему я использую http_build_query ().

37
задан agscala 14 March 2009 в 09:45
поделиться

10 ответов

** не на самом деле только указатель на указатель (как в объявлении), но также разыменовывание разыменовывания (в операторе).

Это часто используется в C, который не имеет & нотация для ссылок, например, обновить возвращаемое значение, которое является типом указателя:

int alloc_foo(struct foo **foo_ret)
{
    *foo_ret = malloc(sizeof(struct foo));
    return 1; /* to indicate success; return value in foo_ret */
}
44
ответ дан Antti Huima 7 August 2019 в 04:19
поделиться

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

11
ответ дан Rob Kennedy 7 August 2019 в 04:19
поделиться

Можно распознать подпись для основного ():

int main(int argc, char* argv[])

следующее эквивалентно:

int main(int argc, char** argv)

В этом случае, argv является указателем на массив char*.

В C, индексный оператор [] является просто другим способом выполнить адресную арифметику с указателями. Например,

foo[i]

производит тот же код как

*(foo + i)
30
ответ дан Parappa 7 August 2019 в 04:19
поделиться

Это - двойное, разыменовывают.

int i = 3;
int* ptr_to_i = &i;
int** ptr_to_ptr_to_i = &ptr_to_i;

std::cout << **ptr_to_ptr_to_i << std::endl;

Печать 3.

6
ответ дан Paul Beckingham 7 August 2019 в 04:19
поделиться

** указатель на указатель.

Это могла бы быть матрица (массив массивов) или массив строк (char массив), и т.д.

9
ответ дан NelsonGon 7 August 2019 в 04:19
поделиться

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

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

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

    • указатель А на массив. Это - обобщение вышеупомянутого случая, так как "строка" (строка C-стиля, так или иначе) является действительно просто массивом char с.

    • массив указателей. У Вас мог бы, например, быть массив указателей на объекты, позволяя, чтобы полиморфизм или массив указателей выбрал объекты, хранившие в другом наборе.

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

5
ответ дан P Daddy 7 August 2019 в 04:19
поделиться

Одно общее использование состоит в том, что это позволяет функции устанавливать указатель в NULL.
Так свободный (указатель) освобождает память, выделенную указателю, но оставляет указатель, опасно указывающий на свободную память.
Вместо этого объявляют my_free (** указатель) и называют my_free (& указатель), так my_free () может установить указатель в NULL после освобождения его.

1
ответ дан Martin Beckett 7 August 2019 в 04:19
поделиться

Можно интерпретировать его буквально - указатель на указатель

4
ответ дан BC. 7 August 2019 в 04:19
поделиться
1
ответ дан Joshua 7 August 2019 в 04:19
поделиться
  • int **var объявляет указатель на указатель
  • **var ссылается на содержание указателя, который сам по себе указывает на указатель
3
ответ дан Tony the Pony 27 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

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