что ** означает в C - PullRequest
29 голосов
/ 23 мая 2010

Что это значит, когда объект имеет 2 звездочки в начале?

**variable

Ответы [ 12 ]

46 голосов
/ 23 мая 2010

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

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
29 голосов
/ 23 мая 2010

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

EDIT Это может быть полезно, например, для динамического размещения многомерных массивов:

Как:

#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
    }
}
6 голосов
/ 23 мая 2010

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

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

6 голосов
/ 23 мая 2010

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

4 голосов
/ 24 мая 2010

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

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

4 голосов
/ 23 мая 2010

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

2 голосов
/ 23 мая 2010

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

char ** variable = ...;

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

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

2 голосов
/ 23 мая 2010

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

Это может означать разные вещи, если это часть декларации:

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

1 голос
/ 24 мая 2010

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

1 голос
/ 24 мая 2010

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

...