Я использую следующую функцию для публикации данных с помощью 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 ().
** не на самом деле только указатель на указатель (как в объявлении), но также разыменовывание разыменовывания (в операторе).
Это часто используется в C, который не имеет & нотация для ссылок, например, обновить возвращаемое значение, которое является типом указателя:
int alloc_foo(struct foo **foo_ret)
{
*foo_ret = malloc(sizeof(struct foo));
return 1; /* to indicate success; return value in foo_ret */
}
Это не **
маркер. Это просто *
маркер, сопровождаемый другим *
маркер. В Вашем случае у Вас есть указатель на указатель, и он разыменовывается дважды для получения то на независимо от того, что действительно указывают.
Можно распознать подпись для основного ():
int main(int argc, char* argv[])
следующее эквивалентно:
int main(int argc, char** argv)
В этом случае, argv является указателем на массив char*.
В C, индексный оператор [] является просто другим способом выполнить адресную арифметику с указателями. Например,
foo[i]
производит тот же код как
*(foo + i)
Это - двойное, разыменовывают.
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.
**
указатель на указатель.
Это могла бы быть матрица (массив массивов) или массив строк (char
массив), и т.д.
Я просто хотел подчеркнуть часть использования для указателя на указатель. Большинство из этих затронуто другими сообщениями, но я думал, что повторение могло бы помочь.
Это позволяет вызываемому , изменяют указатель, принадлежавший вызывающей стороне. Например, можно было передать указатель на указатель на начало строки, и вызываемый мог изменить указанный указатель, чтобы теперь указать на положение в строке, где конкретный символ происходит.
, поскольку массивы ухудшаются к указателям (и указатели может рассматриваться как массивы), Вы будете часто видеть указатель на указатель, если Вы будете иметь:
указатель А на массив. Это - обобщение вышеупомянутого случая, так как "строка" (строка C-стиля, так или иначе) является действительно просто массивом char
с.
массив указателей. У Вас мог бы, например, быть массив указателей на объекты, позволяя, чтобы полиморфизм или массив указателей выбрал объекты, хранившие в другом наборе.
массив массивов. Снова, массивы ухудшаются к указателям, таким образом, это - конкретный случай вышеупомянутого. Это часто используется для так называемых "зубчатых" массивов (в противоположность прямоугольному).
Одно общее использование состоит в том, что это позволяет функции устанавливать указатель в NULL.
Так свободный (указатель) освобождает память, выделенную указателю, но оставляет указатель, опасно указывающий на свободную память.
Вместо этого объявляют my_free (** указатель) и называют my_free (& указатель), так my_free () может установить указатель в NULL после освобождения его.
Можно интерпретировать его буквально - указатель на указатель
int **var
объявляет указатель на указатель **var
ссылается на содержание указателя, который сам по себе указывает на указатель