Это встроенная функция LINQ. Просто используйте метод расширения Where.
См. Синтаксис запроса LINQ в сравнении с синтаксисом метода (C #) для получения дополнительной информации.
Как указатели на указатели работают в 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]
Вы не можете использовать указатель на двумерный массив, хотя если вы хотите поддерживать переменное количество элементы для РЯДОВ и КОЛОНН. Но если вы заранее знаете, вы должны использовать двумерный массив.
Предположим, что это 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 *
. Вы можете прочитать это: Указатели to Pointers
Надеюсь, это поможет прояснить некоторые основные сомнения.
Когда требуется ссылка на указатель. Например, если вы хотите изменить значение (адрес, на который указывает) переменной-указатель, объявленной в области действия вызывающей функции внутри вызываемой функции.
Если вы передадите единственный указатель в качестве аргумента, вы измените локальные копии указателя, а не исходный указатель в вызывающей области. Указав указатель, вы изменяете последний.
Указатель на указатель также называется дескриптором . Часто это используется, когда объект можно переместить в памяти или удалить. Часто приходится блокировать и разблокировать использование объекта , чтобы он не перемещался при доступе к нему.
Он часто используется в среде с ограничением памяти, например, на компьютере Palm OS.
У вас есть переменная, которая содержит адрес чего-то. Это указатель.
Затем у вас есть другая переменная, которая содержит адрес первой переменной. Это указатель на указатель.
это указатель на значение адреса указателя. (это ужасно, я знаю)
в основном, он позволяет вам передавать указатель на значение адреса другого указателя, поэтому вы можете изменить, куда указывает другой указатель из подфункции, например:
void changeptr(int** pp)
{
*pp=&someval;
}
Указатель на указатель - это, в общем, указатель на указатель.
Наглядным примером someType ** является двумерный массив: у вас есть один массив, заполненный указателями на другие массивы, поэтому, когда вы пишете
dpointer [5] [6]
, вы получаете доступ к массиву, который содержит указатели на другие массивы в его 5-й позиции, получаете указатель (пусть fpointer его имя), а затем получаете доступ к 6-му элементу массив, на который ссылается этот массив (так, fpointer [6]).
Когда мы рассказывали о указателях на курсе программирования в университете, нам дали два совета относительно того, как начать изучать их. Первым был просмотр Pointer Fun With Binky . Во-вторых, вспомнить Глаза Пикши из Зазеркалье
Льюиса Кэрролла. «Тебе грустно», - сказал Рыцарь тревожным тоном: «Позволь мне спеть тебе песня, чтобы утешить тебя ».
« Она очень длинная? » - спросила Алиса, потому что в тот день она услышала много стихов.
«Это длинно, - сказал Рыцарь, - но это очень, очень красиво. Каждый, кто слышит, как я пою ее - либо это вызывает слезы у них на глазах, либо… »
« Или еще что? » - сказала Алиса, потому что Рыцарь сделал внезапную паузу.
«Или нет, знаете ли. Название песни «Haddocks 'Eyes». »
« О, это название песни, не так ли? »- сказала Алиса, пытаясь заинтересоваться.
« Нет, ты не понимаешь. , - сказал Рыцарь, выглядя немного раздраженным. - Так называется это имя. Имя на самом деле - «Пожилой мужчина».
«Тогда мне следовало сказать:« Так называется песня »? ” Алиса поправилась.
«Нет, не надо: это совсем другое! Песня называется« Ways And Means »: но это только то, что она называется, понимаете!»
«Ну, что это за песня, тогда? " - сказала Алиса, которая к этому времени была полностью сбита с толку.
«Я уже подходил к этому, - сказал Рыцарь. - На самом деле песня -« Сидит на воротах », а мелодия - мое собственное изобретение. ”