Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Вниз

Ищу помощи, как новичок.   Найти похожие ветки 

 
palva ©   (2007-08-02 16:05) [80]

Наверно, плохо объяснил. Лучше изучать это дело на примерах.


 
Галинка ©   (2007-08-02 16:12) [81]

palva ©   (02.08.07 16:05) [80]

объяснил нормально. на каких примерах и как изучать? в отладчике код на асме смотреть?


 
Kerk ©   (2007-08-02 16:14) [82]

> [81] Галинка ©   (02.08.07 16:12)

Лучше какую-нить книжку по С почитать стоит, я думаю. На асме - это для извращенцев :)


 
Algol   (2007-08-02 16:19) [83]


> palva ©   (02.08.07 16:01) [79]

А чем это описание отличается от описанного выше?
Или вы хотите сказать что в с++ ссылке можно присваивать РАЗНЫЕ переменные? (спрашиваю, без сарказма, действительно не знаю, потому как я не сишник) Если же это константа, то какой смысл ее передавать функции?


 
Галинка ©   (2007-08-02 16:25) [84]

Да читаю я. Но про ссылок там нет. Наверное надо еще Страуструпа почитать.

А вот по теме вспомнила еще. Сэджвика "Фундаментальные алгоритмы на Си" (за прваильность названия не ручаюсь). Хорошая книга?


 
Kerk ©   (2007-08-02 16:27) [85]

> [83] Algol   (02.08.07 16:19)

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


 
Algol   (2007-08-02 16:35) [86]


> Kerk ©   (02.08.07 16:27) [85]

Я тоже так думаю... Но по словам plava "Ссылка экономит нам звездочки"...
Если это действительно так, то я могу согласится, что ссылка в C++(!) - довольно бесполезная штука, этакий синтаксичейский сахар, сомнительный к тому же...
То же что описывал я, именно относится к передаче параметра по ссылке (то есть ref или var).


 
palva ©   (2007-08-02 16:42) [87]

> Если же это константа, то какой смысл ее передавать функции?
Никакого особого смысла не имеет, вернее смысл ровно такой, как и передача по значению обычной целой переменной. Переменная r, описана как ссылка, но выражение r имеет тип int. Но это не константа. Если меняется n, то изменится и r. И наоборот. Это типа синонима переменной n. Можно передать в функцию адрес ссылки, тогда ссылку можно изменить внутри функции (не адрес, конечно, а само значение)

#include <stdio.h>
int n;
int &r = n;
void fun(int *i) {*i=888;}
void main() {
 n = 777;
 printf("%d\n", n); // 777
 fun(&r);
 printf("%d\n", n); // 888
}


 
Галинка ©   (2007-08-02 16:48) [88]


> Если же это константа, то какой смысл ее передавать функции?


только тем, что работать будешь напрямую с переменной, а не с ее локальной копией, переданную в эту процедуру.


 
palva ©   (2007-08-02 16:50) [89]

Но все эти конструкции практически не применяются на практике. Ссылки придуманы единственно ради того, чтобы передавать параметры по ссылке. В чистом си для этого приходится передавать указатель, как выше. А в си++ можно написать так:

#include <stdio.h>
int n;
void fun(int &i) {i=888;}  // procedure fun(Var i: Integer)
void main() {
 n = 777;
 printf("%d\n", n); // 777
 fun(n);
 printf("%d\n", n); // 888
}

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


 
Algol   (2007-08-02 16:55) [90]


> palva ©   (02.08.07 16:42) [87]

Правильно я понял, что сишная ссылка места в памяти не занимает, то есть не является переменной?


 
alex_*** ©   (2007-08-02 17:06) [91]


> Правильно я понял, что сишная ссылка места в памяти не занимает,
>  то есть не является переменной?
>

теперь я не понял. Где же ей обретаться?


 
Kerk ©   (2007-08-02 17:07) [92]

Как я понял, ссылка - это тупо псевдоним. Что-то наподобие можно с #define делать.


 
palva ©   (2007-08-02 17:08) [93]

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


 
palva ©   (2007-08-02 17:17) [94]

Что-то я про возврат значения по ссылке вам какую-то чушь написал.
На самом деле, если функция возвращает ссылку, то вызов этой функции можно располагать в левой части оператора присваивания. Вот пример.

#include <stdio.h>
int& fun(int *p) {
 return *p;
}
void main() {
 int n = 5;
 printf("%d\n", n); // 5
 fun(&n) = 7;
 printf("%d\n", n); // 7
}


 
palva ©   (2007-08-02 17:21) [95]


> теперь я не понял. Где же ей обретаться?

Компилятор помнит, что она синоним. А что тут странного, такая же конструкция есть в PHP.


 
boriskb ©   (2007-08-02 17:28) [96]


> А что тут странного,


Это еще в PL/I было.
Можно было объявить х:Int и указать что эта же память отводится под y:bin и она же s:str
На первый взляг кажется - "зачем? несовместимость типов рано или поздно гарантирована", на на самом деле бывало очень удобно.
А уж чтоб область памяти могла интепритироваться разными типами - забота программиста


 
Kerk ©   (2007-08-02 17:28) [97]

В паскале было absolute


 
palva ©   (2007-08-02 17:46) [98]

> В паскале было absolute
В нынешнем делфи тоже есть. Только в delphi absolute используется для того, чтобы одна и та же область памяти могла интерпретироваться как переменные разных типов. В си для этого тоже можно использовать ссылки:
#include <stdio.h>
char d[4];
int &n=*(int*)d;
void main() {
 n = 0;
 d[0] = 1;
 d[1] = 1;
 printf("%d\n", n); // 257
}

Здесь d массив байтов (знаковых), а n целая переменная занимающая то же самое место в памяти.


 
palva ©   (2007-08-02 17:55) [99]

Бедный AntifreezeeR (((


 
Kerk ©   (2007-08-02 17:57) [100]

Значит приходим к выводу, что ссылки в С - это аналог паскалевского absolute. Разница только в том, что в паскале нельзя их переприсваивать.


 
Kerk ©   (2007-08-02 18:01) [101]

> [99] palva ©   (02.08.07 17:55)

Это кто?


 
palva ©   (2007-08-02 18:09) [102]


> Это кто?

Это автор сабжа.


 
Algol   (2007-08-02 18:09) [103]


> Это кто?

Это топикстартер.... Он хотел узнать с чего начинать изучение делфи :)


 
Kerk ©   (2007-08-02 18:10) [104]

А... да ну его :))


 
Anatoly Podgoretsky ©   (2007-08-02 22:46) [105]

> Игорь Шевченко  (02.08.2007 10:48:37)  [37]

Еще интереснее, что об этом говорит математика.


 
Anatoly Podgoretsky ©   (2007-08-02 22:48) [106]

> Kerk  (02.08.2007 12:08:39)  [39]

Указатель это переменная хранящая ссылку, а ссылка это само значение адреса, так понятно?


 
Anatoly Podgoretsky ©   (2007-08-02 22:51) [107]

> Kerk  (02.08.2007 13:32:58)  [58]

Вот когда вылетишь по AV при компиляции тогда и поймешь, происходит или нет.


 
Anatoly Podgoretsky ©   (2007-08-02 22:52) [108]

> Галинка  (02.08.2007 13:33:01)  [61]

@имя
$FFFF0


 
Anatoly Podgoretsky ©   (2007-08-02 22:54) [109]

> Галинка  (02.08.2007 13:47:07)  [67]

Об этом надо было думать раньше, а не называть тему как "Ищу помощи, как новичок."


 
Галинка ©   (2007-08-03 11:58) [110]

Anatoly Podgoretsky ©   (02.08.07 22:54) [109]

тема не моя. Просто как-то к слову пришлось. Вот и начали обсуждать указатели и ссылки ))


 
Anatoly Podgoretsky ©   (2007-08-03 16:06) [111]

> Галинка  (03.08.2007 11:58:50)  [110]

Да ладно, все равно нет одназначности, особенно при межязыковом сравнение.



Страницы: 1 2 3 вся ветка

Форум: "Прочее";
Текущий архив: 2007.09.02;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.65 MB
Время: 0.056 c
2-1186412601
^_____^
2007-08-06 19:03
2007.09.02
Работа с множествами.


2-1186399551
gentos
2007-08-06 15:25
2007.09.02
primary key


2-1186592484
Knob
2007-08-08 21:01
2007.09.02
Самый тупой вопрос


2-1186566622
DINOEL
2007-08-08 13:50
2007.09.02
нетривиальная задача ,нужно заархивировать 30 файлов в zip


2-1186656444
Kolan
2007-08-09 14:47
2007.09.02
У ComboBox на фрейме не случается MeasurmentComboBoxDrawItem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский