Альтернатива сериализации и уникальности
$ test = [['abc', 'def'], ['ghi', 'jkl'], ['mno', 'pql'], ['abc', 'def'], ['ghi', 'jkl'], ['mno', 'pql'],]; $ result = array_reduce ($ test, function ($ carry, $ item) {if (! in_array ($ item, $ carry)) {array_push ($ carry, $ item);} return $ carry;}, []); var_dump ($ результат); / * php unique.php array (3) {[0] = & gt; array (2) {[0] = & gt; строка (3) "abc" [1] = & gt; string (3) "def"} [1] = & gt; array (2) {[0] = & gt; строка (3) "ghi" [1] = & gt; string (3) "jkl"} [2] = & gt; array (2) {[0] = & gt; string (3) "mno" [1] = & gt; string (3) "pql"}}
* /
Вам нужно передать указатель на указатель, если вы хотите это сделать.
void barPush (список BarList **, Bar * bar) {if (list == NULL) вернуть; // нужно передать указатель на указатель на ваш список. // если нет добавления для добавления, то мы выполняем if (bar == NULL) return; // выделяем пространство для нового узла BarList * newNode = malloc (sizeof (BarList)); // присваиваем правильные значения newNode- & gt; val = bar; newNode- & gt; nextBar = * list; // и устанавливаем содержимое указателя на указатель на заголовок списка // (то есть: указатель на голову списка) на новый узел. * list = newNode; }
Затем используйте его следующим образом:
BarList * l; l = EMPTY_LIST; barPush (& амп; л, & амп; b1); // b1 и b2 - это только bar barPush (& amp; l, & amp; b2);
Джонатан Леффлер предложил вернуть нового руководителя списка в комментарии:
BarList * barPush (список BarList *, Bar * bar) {// если нет добавления для добавления, то мы закончили - возвращаем немодифицированный список. if (bar == NULL) возвратный список; // выделяем пространство для нового узла BarList * newNode = malloc (sizeof (BarList)); // присваиваем правильные значения newNode- & gt; val = bar; newNode- & gt; nextBar = list; // возвращаем новый заголовок списка. return newNode; }
Использование становится:
BarList * l; l = EMPTY_LIST; l = barPush (l, & amp; b1); // b1 и b2 - это только бары l = barPush (l, & amp; b2);
Общий ответ: передайте указатель на вещь, которую вы хотите изменить.
В этом случае это будет указатель на указатель, который вы хотите изменить.
Помните, что в C все равно передается по значению.
Вы передаете указатель на указатель, например
int myFunction(int** param1, int** param2) {
// now I can change the ACTUAL pointer - kind of like passing a pointer by reference
}
Да, вы должны передать указатель на указатель. C передает аргументы по значению, а не по ссылке.
Это классическая проблема. Верните выделенный узел или используйте указатель указателя. В C вы должны передать указатель на X в функцию, в которой вы хотите, чтобы ваш X был изменен. В этом случае, поскольку вы хотите, чтобы указатель был изменен, вы должны передать указатель на указатель.