Форум: "Прочее";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
Внизconst и динамические массивы (строки) Найти похожие ветки
← →
кгшзх © (2016-01-16 22:04) [40]Удалено модератором
← →
Kerk © (2016-01-16 22:04) [41]
> Ingener © (16.01.16 21:48) [39]
>
> >Меняется. Copy On Write потому что.
>
> эээ. .. как ты свой пример связал с обсуждаемым вопросом?!
Я тебе показал на простом примере, что операция s[1] := "X"; меняет указатель s.
← →
Ingener © (2016-01-16 22:06) [42]Удалено модератором
← →
кгшзх © (2016-01-16 22:08) [43]Удалено модератором
← →
Ingener © (2016-01-16 22:13) [44]Удалено модератором
← →
кгшзх © (2016-01-16 22:18) [45]Using const allows the compiler to optimize code for structured - and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.
Ну чо, будем и дальше рогом упираться?
русским языком написано, что во главе угла стоит оптимизация передачи структурных типов и строк.
все остальное идет бонусом.
если бы там не уточнялось про структуры и строки, то можно было бы пыхтеть про мифические защиты ЛЮБЫХ типов
Но речь идет именно про оптимизацию передачи структур и строк
← →
Ingener © (2016-01-16 22:18) [46]Удалено модератором
← →
кгшзх © (2016-01-16 22:20) [47]Удалено модератором
← →
Kerk © (2016-01-16 22:21) [48]
> Ingener © (16.01.16 22:13) [44]
>
> >Я тебе показал на простом примере
> >, что операция s[1] := "X"; меняет
> > указатель s.
>
> бррр. Ну давай возьмем такой пример:
Ты сам с собой разговариваешь? В [31] ты спрашиваешь почему компилятор не разрешает сделать s[1] := "X"; для const-строки, хотя эта операция якобы не изменяет указатель.
Так вот. Указатель меняется. Именно поэтому компилятор не разрешает такую операцию для const-строки. Все в соответствии со справкой.
Та же самая разница как между
procedure Test1(Param: PInteger);
procedure Test2(const Param: PInteger);
Во втором случае компилятор не разрешит изменить значение параметра внутри процедуры. В первом разрешит.
← →
Kerk © (2016-01-16 22:22) [49]Удалено модератором
← →
Ingener © (2016-01-16 22:50) [50]Удалено модератором
← →
DayGaykin © (2016-01-17 00:08) [51]
> Я тебе показал на простом примере, что операция s[1] :=
> "X"; меняет указатель s.
Не думал никогда об этом. Действительно так:)
program Project1;
{$APPTYPE CONSOLE}
procedure Test1(S: string);
begin
Writeln("Test1 Old: ":14, Integer(S));
S[1] := "D";
Writeln("Test1 New: ":14, Integer(S));
end;
procedure Test2(var S: string);
begin
Writeln("Test2 Old: ":14, Integer(S));
S[1] := "M";
Writeln("Test2 New: ":14, Integer(S));
end;
var
GS: String;
begin
GS := "Say";
Writeln("Before: ":14, Integer(GS));
Test1(GS);
Writeln("After Test1: ":14, Integer(GS));
Test2(GS);
Writeln("After Test2: ":14, Integer(GS));
Readln;
end.
Вот вывод:
Before: 32673004
Test1 Old: 32673004
Test1 New: 32673028
After Test1: 32673004
Test2 Old: 32673004
Test2 New: 32673004
After Test2: 32673004
← →
Ingener © (2016-01-17 01:01) [52]Удалено модератором
← →
Германн © (2016-01-17 01:06) [53]
> Sha © (16.01.16 16:05) [29]
>
> > Германн © (16.01.16 01:34) [28]
> > хочу знать когда параметр передаётся по ссылке
>
> Почему бы просто не передавать адрес переменной в таком
> случае?
> Иногда подходит использование var-параметров.
Обычно так и передаю, если нужно.
Но хочу понимать чужой код. А в нём может const.
← →
han_malign © (2016-01-19 16:03) [54]const char * (*select)(char const * const * list);
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.046 c