Как делают указатель на указатели работает в C?

Это встроенная функция LINQ. Просто используйте метод расширения Where.

См. Синтаксис запроса LINQ в сравнении с синтаксисом метода (C #) для получения дополнительной информации.

164
задан unwind 22 May 2009 в 12:18
поделиться

9 ответов

Как указатели на указатели работают в C?

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

Указатель на Указатель - это переменная, как и любая другая переменная, но содержащая адрес переменной. Эта переменная просто указатель.

Когда бы вы их использовали?

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

Пример:

int getValueOf5(int *p)
{
  *p = 5;
  return 1;//success
}

int get1024HeapMemory(int **p)
{
  *p = malloc(1024);
  if(*p == 0)
    return -1;//error
  else 
    return 0;//success
}

И вы называете это так:

int x;
getValueOf5(&x);//I want to fill the int varaible, so I pass it's address in
//At this point x holds 5

int *p;    
get1024HeapMemory(&p);//I want to fill the int* variable, so I pass it's address in
//At this point p holds a memory address where 1024 bytes of memory is allocated on the heap

Есть и другие варианты использования, например, аргумент main () каждой программы C имеет указатель на указатель для argv, где каждый элемент содержит массив символы, которые являются параметрами командной строки. Вы должны быть осторожны, хотя, когда вы используете указатели указателей для указания на двумерные массивы, это ' Вместо этого лучше использовать указатель на двумерный массив.

Почему это опасно?

void test()
{
  double **a;
  int i1 = sizeof(a[0]);//i1 == 4 == sizeof(double*)

  double matrix[ROWS][COLUMNS];
  int i2 = sizeof(matrix[0]);//i2 == 240 == COLUMNS * sizeof(double)
}

Вот пример правильно выполненного указателя на двумерный массив:

int (*myPointerTo2DimArray)[ROWS][COLUMNS]

Вы не можете использовать указатель на двумерный массив, хотя если вы хотите поддерживать переменное количество элементы для РЯДОВ и КОЛОНН. Но если вы заранее знаете, вы должны использовать двумерный массив.

41
ответ дан 23 November 2019 в 21:10
поделиться

Предположим, что это 8-битный компьютер с 8-битными адресами (и, следовательно, только 256 байт памяти). Это часть этой памяти (числа вверху - это адреса):

  54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|    | 58 |    |    | 63 |    | 55 |    |    | h  | e  | l  | l  | o  | \0 |    |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

Здесь вы можете увидеть, что с адреса 63 начинается строка «hello». Таким образом, в этом случае, если это единственное появление "hello" в памяти, то

const char *c = "hello";

... определяет c как указатель на строку "hello" (только для чтения), и таким образом, содержит значение 63. c сам должен где-то храниться: в приведенном выше примере в ячейке 58. Конечно, мы можем указывать не только на символы, но и на другие указатели. Например:

const char **cp = &c;

Теперь cp указывает на c , то есть он содержит адрес c (то есть 58). Мы можем пойти еще дальше. Рассматривать:

const char ***cpp = &cp;

Теперь cpp хранит адрес cp . Итак, он имеет значение 55 (на основе приведенного выше примера), и вы уже догадались: он сам хранится по адресу 60.


Что касается , почему используются указатели на указатели:

  • Имя массив обычно дает адрес своего первого элемента. Итак, если массив содержит элементы типа t , ссылка на массив имеет тип t * . Теперь рассмотрим массив массивов типа t : естественно, ссылка на этот 2D-массив будет иметь тип (t *) * = t ** и будет отсюда указатель на указатель.
  • Несмотря на то, что массив строк кажется одномерным, на самом деле он двумерный, поскольку строки представляют собой массивы символов. Отсюда: char ** .
  • Функция f должна будет принять аргумент типа t ** , если она должна изменить переменную типа t * .
  • Многие другие причины слишком многочисленны, чтобы перечислять их здесь.
347
ответ дан 23 November 2019 в 21:10
поделиться

Вы можете прочитать это: Указатели to Pointers

Надеюсь, это поможет прояснить некоторые основные сомнения.

12
ответ дан 23 November 2019 в 21:10
поделиться

Когда требуется ссылка на указатель. Например, если вы хотите изменить значение (адрес, на который указывает) переменной-указатель, объявленной в области действия вызывающей функции внутри вызываемой функции.

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

7
ответ дан 23 November 2019 в 21:10
поделиться

Указатель на указатель также называется дескриптором . Часто это используется, когда объект можно переместить в памяти или удалить. Часто приходится блокировать и разблокировать использование объекта , чтобы он не перемещался при доступе к нему.

Он часто используется в среде с ограничением памяти, например, на компьютере Palm OS.

. howstuffworks.com Ссылка >>

www.flippinbits.com Ссылка >>

7
ответ дан 23 November 2019 в 21:10
поделиться

У вас есть переменная, которая содержит адрес чего-то. Это указатель.

Затем у вас есть другая переменная, которая содержит адрес первой переменной. Это указатель на указатель.

5
ответ дан 23 November 2019 в 21:10
поделиться

это указатель на значение адреса указателя. (это ужасно, я знаю)

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

void changeptr(int** pp)
{
  *pp=&someval;
}
5
ответ дан 23 November 2019 в 21:10
поделиться

Указатель на указатель - это, в общем, указатель на указатель.

Наглядным примером someType ** является двумерный массив: у вас есть один массив, заполненный указателями на другие массивы, поэтому, когда вы пишете

dpointer [5] [6]

, вы получаете доступ к массиву, который содержит указатели на другие массивы в его 5-й позиции, получаете указатель (пусть fpointer его имя), а затем получаете доступ к 6-му элементу массив, на который ссылается этот массив (так, fpointer [6]).

3
ответ дан 23 November 2019 в 21:10
поделиться

Когда мы рассказывали о указателях на курсе программирования в университете, нам дали два совета относительно того, как начать изучать их. Первым был просмотр Pointer Fun With Binky . Во-вторых, вспомнить Глаза Пикши из Зазеркалье

Льюиса Кэрролла. «Тебе грустно», - сказал Рыцарь тревожным тоном: «Позволь мне спеть тебе песня, чтобы утешить тебя ».

« Она очень длинная? » - спросила Алиса, потому что в тот день она услышала много стихов.

«Это длинно, - сказал Рыцарь, - но это очень, очень красиво. Каждый, кто слышит, как я пою ее - либо это вызывает слезы у них на глазах, либо… »

« Или еще что? » - сказала Алиса, потому что Рыцарь сделал внезапную паузу.

«Или нет, знаете ли. Название песни «Haddocks 'Eyes». »

« О, это название песни, не так ли? »- сказала Алиса, пытаясь заинтересоваться.

« Нет, ты не понимаешь. , - сказал Рыцарь, выглядя немного раздраженным. - Так называется это имя. Имя на самом деле - «Пожилой мужчина».

«Тогда мне следовало сказать:« Так называется песня »? ” Алиса поправилась.

«Нет, не надо: это совсем другое! Песня называется« Ways And Means »: но это только то, что она называется, понимаете!»

«Ну, что это за песня, тогда? " - сказала Алиса, которая к этому времени была полностью сбита с толку.

«Я уже подходил к этому, - сказал Рыцарь. - На самом деле песня -« Сидит на воротах », а мелодия - мое собственное изобретение. ”

13
ответ дан 23 November 2019 в 21:10
поделиться
Другие вопросы по тегам:

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