Использование для нескольких уровней указателя разыменовывает?

Я решил проблему с помощью обходного пути. Я сделал замену до json.loads

import json
import csv

with open("sensors.json", "r") as read_file:
    sensors = json.load(read_file)
with open ("samples.json", "r") as myfile:
    data=myfile.read()

for key1 in sensors:
    data = data.replace(key1, sensors[key1]['name'])

data = json.loads(data)
42
задан Magnus Hoff 4 May 2010 в 20:59
поделиться

12 ответов

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

char *foo;

- «char, на которую указывает указатель foo». Однако

char *** foo;

- это «char, на который указывает указатель, который указывает на указатель, который указывает на указатель foo». Таким образом, foo - это указатель. По этому адресу находится второй указатель. По адресу, на который он указывает, находится третий указатель. Разыменование третьего указателя приводит к символу. Если это все, что можно сказать об этом, трудно найти в этом аргументы.

Тем не менее, кое-какую полезную работу можно проделать. Представьте, что мы пишем замену bash или другую программу управления процессами. Мы хотим управлять вызовами наших процессов объектно-ориентированным способом ...

struct invocation {
    char* command; // command to invoke the subprocess
    char* path; // path to executable
    char** env; // environment variables passed to the subprocess
    ...
}

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

void browse_env(size_t envc, char*** env_list);
57
ответ дан 26 November 2019 в 23:36
поделиться

При использовании вложенных динамически размещаемых (или связанных с указателем) структур данных. Все эти вещи связаны указателями.

0
ответ дан 26 November 2019 в 23:36
поделиться

Указатели на указатели редко используются в C ++. В основном они имеют два применения.

Первое использование - передача массива. char ** , например, является указателем на указатель на char, который часто используется для передачи массива строк. Указатели на массивы не работают по уважительным причинам, но это другая тема (см. comp.lang.c FAQ , если вы хотите узнать больше). В некоторых редких случаях вы можете увидеть третий * , используемый для массива массивов, но обычно более эффективно хранить все в одном смежном массиве и индексировать его вручную (например, array [x + y] * width] , а не array [x] [y] ). В C ++ однако это гораздо реже из-за контейнерных классов.

Второе использование - передача по ссылке. Параметр int * позволяет функции изменять целое число, на которое указывает вызывающая функция, и обычно используется для предоставления нескольких возвращаемых значений. Этот шаблон передачи параметров по ссылке для разрешения множественных возвратов все еще присутствует в C ++, но, как и другие способы передачи по ссылке, обычно заменяется введением реальных ссылок. Другая причина для передачи по ссылке - избегание копирования сложных конструкций - также возможна со ссылкой на C ++.

C ++ имеет третий фактор, который уменьшает использование нескольких указателей: он имеет строку string . Ссылка на строку может принимать тип char ** в C,

0
ответ дан 26 November 2019 в 23:36
поделиться

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

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

2
ответ дан 26 November 2019 в 23:36
поделиться

N-мерные динамически распределенные массивы, где N> 3, требуют трех или более уровней косвенности в C.

4
ответ дан 26 November 2019 в 23:36
поделиться
 int main( int argc, char** argv );
1
ответ дан 26 November 2019 в 23:36
поделиться

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

Причиной создания такого кода является то, что вы хотите, чтобы компилятор / интерпретатор мог правильно проверять используемые вами типы (предотвращать таинственные ошибки).

Вам не нужно использовать такие типы - вы всегда можете просто использовать простой "void *" и typecast всякий раз, когда вам нужно разыменовать указатель и получить доступ к данным, на которые указывает указатель. Но это, как правило, плохая практика и склонность к ошибкам - конечно, есть случаи, когда использование void * действительно полезно и делает код намного более элегантным. Думайте об этом больше как о вашем последнем прибежище.

=>

0
ответ дан 26 November 2019 в 23:36
поделиться

Если вам нужно изменить указатель внутри функции, вы должны передать ссылку на него.

0
ответ дан 26 November 2019 в 23:36
поделиться

Функции, которые инкапсулируют создание ресурсов, часто используют двойные указатели. То есть вы передаете адрес указателя на ресурс. Затем функция может создать рассматриваемый ресурс и установить указатель на него. Это возможно только в том случае, если у него есть адрес указанного указателя, поэтому он должен быть двойным указателем.

1
ответ дан 26 November 2019 в 23:36
поделиться

Стандартное использование двойных указателей, например: myStruct ** ptrptr, - это указатель на указатель. Например, в качестве параметра функции это позволяет вам изменять фактическую структуру, на которую указывает вызывающий объект, вместо того, чтобы изменять значения только внутри этой структуры.

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

Указатель - это просто переменная, которая содержит адрес памяти.

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

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

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

Вот пример возврата значения указателя через параметр:

//Not a very useful example, but shows what I mean...
bool getOffsetBy3Pointer(const char *pInput, char **pOutput)
{
  *pOutput = pInput + 3;
  return true;
}

И вы вызываете эту функцию так:

const char *p = "hi you";
char *pYou;
bool bSuccess = getOffsetBy3Pointer(p, &pYou);
assert(!stricmp(pYou, "you"));
5
ответ дан 26 November 2019 в 23:36
поделиться

Even if you block the enter button, they could still paste in newlines. Это предотвратило бы кнопку ввода и удалило все новые строки и возврат каретки, которые вошли в любом случае (только пробовал это на FF, и думал об этом минимально - это может не работать на Safari или IE как есть).

<textarea rows="20" cols="50" onkeydown="return ignoreEnter(event);" onkeyup="noEnter(this);"></textarea>
<script type="text/javascript">
function ignoreEnter( event ) {
 return thisEvent.keyCode != 13; // enter key
}

function noEnter( e ) {
 e.value = e.value.replace(/\n/g,'');
 e.value = e.value.replace(/\r/g,'');
}
</script>
- 121 --- 4862221--

Вероятно, было бы лучше отбросить const (в любом случае, зачем вам на этом настаивать?).

В противном случае вы должны создать объединяющий итератор. Код довольно большой, подробнее см. в этой теме .

(смотрите ссылки в конце - ТАК не любит их)

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

Похоже, вам нужно какое-то объяснение, что такое указатели и как они работают? You need to understand that first, if you don't already.

But that's a separate question (:

http://www.google.com/codesearch/p?hl=en#e_ObwTAVPyo/security/nss/lib/ckfw/capi/ckcapi.h&q=***%20lang:c&l=301

http://www.google.com/codesearch/p?hl=en#eVvq2YWVpsY/openssl-0.9.8e/crypto/ec/ec_mult.c&q=***%20lang:c&l=344

0
ответ дан 26 November 2019 в 23:36
поделиться
Другие вопросы по тегам:

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