2015-11-23 7 views
1

Я всегда смотрю на множество открытых исходников для libusb, чтобы получить информацию о USB-устройствах. В этом они объявили, что: libusb_device ** devs = NULL; // указатель на указатель для извлечения списка устройств. Но в некоторых других реализациях они были объявлены одним указателем.Почему у libusb_devices ** devs есть двойной указатель?

С моей точки зрения, двойной указатель используется для динамического изменения значения переменной. Так что, если какое-либо устройство подключено, значит, оно автоматически обновится в этом поле devs. Это поле используется в libusb_get_device_list (NULL, & devs);. Так что он вернет правильные списки устройств.

Это право?

И еще одно: Указатель на указатель мы можем сказать как указатель на одномерный массив. Все подключенные устройства хранятся как одномерный массив в libusb?

Как изменится поведение, если мы объявим с помощью одного указателя?

ответ

1

Вы на правильном пути, но не правы: речь идет не о возможности изменить ситуацию во время выполнения.

Кроме того, API имеет тройную *, а не только два:

ssize_t libusb_get_device_list ( libusb_context * ctx, 
     libusb_device *** list 
    )  

Список устройств является список указателей устройств (указатель устройства, следовательно, «внутренний» *); метод C-стиля для составления списка вещей переносит указатель на первый элемент, который в этом случае является указателем на указатель на устройство.

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

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

+0

U означает, что список устройств имеет указатель на все устройства, чтобы скрыть эти указатели, мы используем двойные указатели? – freeworld

+0

@freeworld не имеет ничего общего со скрытием; это действительно то, как у вас есть список указателей. –

+0

: Thankyou.Suppose, если мы использовали в качестве одного указателя, также будут какие-либо изменения поведения? Или нам нужно позаботиться о чем-либо для одного указателя? – freeworld