Передающие ссылки на указатели в C++

Вот немного другой метод. [ ухмыляясь ] мне удалось не заметить ответ Джеффа Цейтлина, пока я не закончил это.

[edit - спасибо Джеффу Зейтлину за напоминание, что ОП хочет получить конечный результат в виде строки. упс! [* blush *]]

что он делает ...

  • разбивает строку на точки
  • помещает это в массив [int] & амп; принуждает элементы в этот тип
  • увеличивает элемент в целевом слоте
  • соединяет элементы обратно в строку с точкой для разделителя
  • преобразует это в IP-адрес type
  • добавляет строку для преобразования IP-адреса в строку

вот код ...

$OriginalIPv4 = '1.1.1.1'
$TargetOctet = 3

$OctetList = [int[]]$OriginalIPv4.Split('.')
$OctetList[$TargetOctet - 1]++

$NewIPv4 = [ipaddress]($OctetList -join '.')

$NewIPv4
'=' * 30
$NewIPv4.IPAddressToString

output ...

[ 111]
120
задан gsamaras 4 November 2015 в 01:33
поделиться

8 ответов

Ваша функция ожидает ссылку на фактический указатель строки в вызывающей области, а не на анонимный указатель на строку. Таким образом:

string s;
string* _s = &s;
myfunc(_s);

должен компилироваться нормально.

Однако это полезно только в том случае, если вы намереваетесь изменить указатель, который вы передаете функции. Если вы намереваетесь изменить саму строку, вам следует использовать ссылку на строку, как предлагает Саке. Имея это в виду, должно быть более очевидно, почему компилятор жалуется на ваш исходный код. В вашем коде указатель создается «на лету», изменение этого указателя не будет иметь никаких последствий, и это не то, что предполагается. Идея ссылки (а не указателя) заключается в том, что ссылка всегда указывает на реальный объект.

118
ответ дан 24 November 2019 в 01:39
поделиться

myfunc ("string * & val"), это само по себе не ' не имеет никакого смысла. «string * & val» подразумевает «string val», * и & отменяет друг друга. Наконец, нельзя передать строковую переменную в функцию («string val»). Только основные типы данных могут быть переданы в функцию, для других типов данных необходимо передать в качестве указателя или ссылки. Вы можете использовать либо строку & val, либо строку * val для функции.

-8
ответ дан 24 November 2019 в 01:39
поделиться

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

Myfunc(String** s)
-1
ответ дан 24 November 2019 в 01:39
поделиться

Замените его на:

  std::string s;
  std::string* pS = &s;
  myfunc(pS);

РЕДАКТИРОВАТЬ:

Это называется ref-to -pointer , и вы не можете передать временный адрес в качестве ссылки на функцию. (если это не ссылка на константу ).

Хотя я показал std :: string * pS = & s; (указатель на локальную переменную), его типичное использование будет : когда вы хотите, чтобы вызываемый объект изменял сам указатель, а не объект, на который он указывает. Например, функция, которая выделяет память и назначает адрес блока памяти, который она выделила своему аргументу, должна принимать ссылку на указатель или указатель на указатель:

void myfunc(string*& val)
{
//val is valid even after function call
   val = new std::string("Test");

}
10
ответ дан 24 November 2019 в 01:39
поделиться

Попробуйте:

void myfunc(string& val)
{
    // Do stuff to the string pointer
}

// sometime later 
{
    // ...
    string s;
    myfunc(s);
    // ...
}

или

void myfunc(string* val)
{
    // Do stuff to the string pointer
}

// sometime later 
{
    // ...
    string s;
    myfunc(&s);
    // ...
}
3
ответ дан 24 November 2019 в 01:39
поделиться

Проблема в том, что вы пытаетесь привязать временную ссылку к ссылке, что C ++ не позволяет, если ссылка не const .

Таким образом, вы можете выполните одно из следующих действий:

void myfunc(string*& val)
{
    // Do stuff to the string pointer
}


void myfunc2(string* const& val)
{
    // Do stuff to the string pointer
}

int main()
// sometime later 
{
    // ...
    string s;
    string* ps = &s;

    myfunc( ps);   // OK because ps is not a temporary
    myfunc2( &s);  // OK because the parameter is a const&
    // ...

    return 0;
}
84
ответ дан 24 November 2019 в 01:39
поделиться

& s создает временный указатель на строку, и вы не можете ссылаться на временный объект.

5
ответ дан 24 November 2019 в 01:39
поделиться

РЕДАКТИРОВАТЬ: Я экспериментировал с некоторыми, и обнаруженные вещи оказались немного более тонкими, чем я думал. Вот то, что я считаю точным ответом:

& s не является lvalue, поэтому вы не можете создать ссылку на него, если тип ссылки не ссылается на const . Так, например, вы не можете сделать

string * &r = &s;

, но можете сделать

string * const &r = &s;

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

void myfunc(string * const &a) { ... }

Есть еще одна проблема, а именно временные. Правило состоит в том, что вы можете получить ссылку на временный объект, только если он const . Так что в этом случае можно утверждать, что & s является временным, поэтому его необходимо объявить const в прототипе функции. С практической точки зрения это не имеет значения. (Это либо rvalue, либо временное значение. В любом случае применяется то же правило.) Однако, строго говоря, я думаю, что это не временное, а rvalue. Интересно, есть ли способ провести различие между ними. (Возможно, это просто определено, что все временные значения являются r-значениями, а все не-l-значения являются временными. Я не эксперт по стандарту.)

При этом ваша проблема, вероятно, на более высоком уровне. Зачем нужна ссылка на адрес s ? Если вам нужна ссылка на указатель на s , вам необходимо определить указатель, как в

string *p = &s;
myfunc(p);

. Если вам нужна ссылка на s или указатель на s , сделайте простую вещь.

2
ответ дан 24 November 2019 в 01:39
поделиться
Другие вопросы по тегам:

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