что ** означает в C

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


Несмотря на то, что CSS и HTML не существует, достаточно простой способ сделать это - создать скрытый выберите, установите его только для выбранного значения, и возьмите эту ширину и установите ее на видимый выбор.

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

Добавьте эту логику к «изменению», и она должна быть хорошей и вручную запускать ее один раз, затем вы должны быть хорошими.

const select = document.querySelector('select');
select.addEventListener('change', function() {
  const dummySelect = document.createElement('select');
  dummySelect.classList.add('dummy');
  
  const dummyOption = document.createElement('option');
  dummyOption.innerHTML = this.value;
  dummySelect.appendChild(dummyOption);
  
  document.body.appendChild(dummySelect);
  select.style.width = `${dummySelect.offsetWidth}px`;
  
  document.body.removeChild(dummySelect);
});

// Trigger for the first time
select.dispatchEvent(new Event('change'));
select {
  display: inline;
}

.dummy {
  position: absolute;
  left: -10000px;
}
<select>
 <option>A</option>
 <option>A much longer title</option>
 <option>Middleground</option>
</select>

29
задан Tadeusz A. Kadłubowski 23 May 2010 в 19:40
поделиться

12 ответов

Это указатель на указатель. Для более подробной информации вы можете проверить: Указатель на указатель

РЕДАКТИРОВАТЬ Это может быть полезно, например, для динамического выделения многомерных массивов:

Как:

#include <stdlib.h>

int **array;
array = malloc(nrows * sizeof(int *));
if(array == NULL)
{
    fprintf(stderr, "out of memory\n");
    exit or return
}
for(i = 0; i < nrows; i++)
{
    array[i] = malloc(ncolumns * sizeof(int));
    if(array[i] == NULL)
    {
        fprintf(stderr, "out of memory\n");
        exit or return
    }
}
29
ответ дан Incognito 23 May 2010 в 19:40
поделиться

Это означает, что переменная разыменовывается дважды. Предположим, у вас есть указатель на указатель на символ, например:

char ** variable = ...;

Если вы хотите получить доступ к значению, на которое указывает указатель, вы должны разыменовываем его дважды:

** переменная

2
ответ дан Achim 23 May 2010 в 19:40
поделиться

Указатель на другой указатель

1
ответ дан HZhang 23 May 2010 в 19:40
поделиться

это указатель на указатель. например, если * x означает, что он будет содержать адрес некоторой переменной, чем, если я скажу, что m = & amp; x, чем m, отображается как int ** m

0
ответ дан Kraken 23 May 2010 в 19:40
поделиться

Это указатель на указатель. Вы можете использовать это, если хотите указать на array или const char * (строку). Кроме того, в Objective-C с какао это часто используется для указания на NSError*.

1
ответ дан 23 May 2010 в 19:40
поделиться

Указатель на указатель при объявлении переменной.

Удаление двойного указателя при использовании вне объявления.

6
ответ дан Mavrik 23 May 2010 в 19:40
поделиться

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

4
ответ дан mfabish 23 May 2010 в 19:40
поделиться

** переменная - двойное разыменование. Если переменная является адресом адреса, полученное выражение будет lvalue по адресу, хранящемуся в переменной *.

Это может означать разные вещи, если является частью объявления:

переменная типа ** будет означать, с другой стороны, указатель на указатель, то есть переменную, которая может содержать адрес другого переменная, которая также является указателем, но на этот раз на переменную типа 'type'

2
ответ дан Pavel Radzivilovsky 23 May 2010 в 19:40
поделиться

** - указатель на указатель. Иногда они используются для массивов строк.

1
ответ дан Jake Petroules 23 May 2010 в 19:40
поделиться

В объявлении это означает, что это указатель на указатель:

int **x;  // declare x as a pointer to a pointer to an int

При использовании он задерживает его дважды:

int x = 1;
int *y = &x;  // declare y as a pointer to x
int **z = &y;  // declare z as a pointer to y
**z = 2;  // sets the thing pointed to (the thing pointed to by z) to 2
          // i.e., sets x to 2
46
ответ дан Adam Rosenfield 23 May 2010 в 19:40
поделиться

Это означает, что переменная является указателем на указатель.

6
ответ дан SLaks 23 May 2010 в 19:40
поделиться

Вы можете использовать cdecl для объяснения C-типов.

Здесь есть онлайн интерфейс: http://cdecl.org/ . Введите "int ** x" в текстовое поле и проверьте результат.

4
ответ дан Vimal 23 May 2010 в 19:40
поделиться