Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизPChar Найти похожие ветки
← →
Metotrone (2002-09-24 17:56) [0]Есть ли разница между
var SArr:array[0..7] of Char = "Fucking";
и
var PCh:PChar = "Fucking"; ?
← →
Kibitzer (2002-09-25 00:14) [1]Конечно есть разница. Первый вариант статический (т.е. память под переменную выделяет компилятор, а не программа).
← →
PVOzerski (2002-09-25 04:02) [2]1) Оба варианта изначально завязаны на статическую константу. Разницу Вы почувствуете, когда попытаетесь переприсвоить значение переменным: в 1-м случае новое значение окажется по старому адресу, во 2-м - по новому (если работать неграмотно - то запросто и за пределами кучи). Опять же, обратиться к i-му символу по индексу без особых ухищрений в варианте pChar Вы не сможете. Помимо всего, array вовсе не обязан завершаться #0, хотя Delphi и допускает неявное преобразование в pChar при передаче параметром такого массива. Вот иллюстрация возможного глюка (использован D3):
{$apptype console}
var
x:array[0..2]of char="123";
procedure pr(p:pchar);
begin
writeln(p);
end;
begin
pr(x);
end.
У меня этот пример выдал 123Р, т.е. процедура writeln читала всё подряд, начиная с "1", пока случайно после "Р" не наткнулась на #0. Если бы x было полем в record или class, такое преобразование прихватило бы следующую запись. Если бы х была выделена динамически, можно было бы запрсто вылететь за пределы heap.
2) На заметку (чуть оффтопик, но близко и навеяно вопросом): позволив в Delphi опускать "^" перед "[" и "." после ссылочных переменных, Borland, IMHO, внес больше путаницы, чем удобств.
3) к автору вопроса: а поудачнее значение константы придумать не мог? Ведь, поди, и девушки форум посещают...
← →
Suntechnic (2002-09-25 05:13) [3]Kibitzer © (25.09.02 00:14)
Конечно есть разница. Первый вариант статический (т.е. память под переменную выделяет компилятор, а не программа).
Должен Вас разочаровать, что и под второй вариант память тоже выделяет компилятор, а не программа. Такая конструкция называется строковый литерал. И как уже упомянул уважаемый PVOzerski © (25.09.02 04:02) он константный. Ну а чему Вы присвоили адрес строкового литерала это уже дело десятое.
>PVOzerski © (25.09.02 04:02)
Слово "необязан" я бы всё-таки опустил. Теоретически оно то конечно так, но если мы ведём речь о строках, тогда она обязана завершаться 0 иначе будет o-oops о котором вы упомянули.
Опять же, обратиться к i-му символу по индексу без особых ухищрений в варианте pChar Вы не сможете.
Это почему? Я разве не могу так написать?:
SArr[2] := UpCase(PCh[2]);
Другое дело что присвоить значение туда некорректно (строка то константная), но извлечь то какие могут быть проблемы?
P.S. Вот где ностальгия по старому доброму С просыпается. Появился бы такой вопрос на форуме по С, автора бы просто убили :)
← →
PVOzerski (2002-09-25 07:02) [4]2Suntechnic:
вообще-то pChar определен как указатель на Char, а не на массив. Здесь ведь не Си, индексы так просто к указателю абы на что не приложить. Правда, во FreePascal эту сишную фичу ввели, а вот чтобы в Delphi - не слышал (хотя могу и не знать). Я в таких случаях описываю тип-указатель на массив и привожу к нему pChar.
← →
Suntechnic (2002-09-25 07:20) [5]>PVOzerski © (25.09.02 07:02)
Здесь ведь не Си, индексы так просто к указателю абы на что не приложить. Правда, во FreePascal эту сишную фичу ввели, а вот чтобы в Delphi - не слышал (хотя могу и не знать).
А Вы попробуйте ;)
Здесь то может и не С, но null-terminated strings пришли в Delphi именно из C как я подозреваю. Так что я думаю всё что я дальше буду говорить верно для Delphi точно так же как и для C. Ну а гуру и того и другого пусть попробуют меня поправить :)
вообще-то pChar определен как указатель на Char, а не на массив.
Дык в С это и есть одно и тоже с некоторой поправкой. Всё-таки указатель не на массив, а на Char. Указатель на массив char терминами С это есть **. Всё на самом деле просто. Имя массива это и есть указатель на его начало, только константный указатель (заметьте, константный указатель, а не данные, на которые он указывает).
Я в таких случаях описываю тип-указатель на массив и привожу к нему pChar.
Если вы именно делаете так как говорите(не путаете формулировки) то вы по идее должны объявлять указатель на указатель на Char.
← →
PVOzerski (2002-09-25 07:35) [6]D3 cожрал! :^) Хотя, IMHO, это уж очень по-сишному.
{$apptype console}
type
tA=array[0..0]of char;
pA=^tA;
var
p:pChar="123";
begin
writeln(p[0]); //это я попробовал
writeln(pA(p)[0]); //а это - как я делал раньше...
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c