Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Валентин Жуков
0 / 0 / 0
Регистрация: 23.01.2008
Сообщений: 126
#1

Чем полезны указатели? - C++

23.04.2008, 13:36. Просмотров 1082. Ответов 8
Метки нет (Все метки)

Помогите,пож-ста,начинаю изучать С++ и хочу понять:
1. для чего все-таки полезны указатели и можно ли без них обойтись?
2.Говорят, что в С++ параметры функций передаются по значению, а не по ссылке, но я так понимаю, что указатель и есть ссылка.(?)
Например, если в Паскале для передачи параметров в процедуру используется ссылка(параметр-переменная),тогда этот параметр изменяется,а если значение(параметр-значение), тогда остается неизменным:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
...
var x,y:integer;
procedure change(var a:integer;b:integer)
begin
a:=100;
b:=100;
end;
 
BEGIN
x:=5;
y:=5;
change(x,y);
END.
После этого х=100 (т.к.ссылка а на х будет=100), а у=5(т.к. параметр-значение b не изменяется, а лишь передает значение в процедуру).Как можно передать в виде такой простой процедуры в С парам.-значение и параметр-переменную?И можно ли без указателей?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2008, 13:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем полезны указатели? (C++):

Указатели - в чем суть? - C++
Кто нибидь может мне обястнить укасзатели в С++,ато я некак не врубаюсь.

Указатели. В чем ошибка??? - C++
Здравствуйте! Не могу разобраться, как исправить такую error: error C2061: syntax error : identifier '_TCHAR' Вот код программы: ...

Ссылки vs указатели - в чем разница? - C++
Навеяно соседней темой. Не понимаю в чем разница, хотя несколько раз честно пробовал почитать на эту тему, правда без должного внимания и...

Чем отличаются указатели от ссылок? - C++
Как я понимаю указатель,он хранит адрес переменной,а ссылка просто берёт значение переменной?Привидите примерчик какой=)

Указатели и ссылки: в чем разница - C++
Здравствуйте, объясните, пожалуйста, в чем разница между "ссылается" и "указывает"?

В чем ошибка? (Строки. Массивы. Указатели) - C++
Всем добрый вечер. Объясните пожалуйста в чём ошибка в строке с коментарием "ошибка" ? class CMyString{ char *pStr; ...

8
VVP
23.04.2008, 19:29 #2
Можно:
C++
1
2
3
4
5
6
7
8
9
10
11
void change(int &a, int b)
{    a=100;
     b=100;
}
 
void main(void)
{    int x=5, y=10;
     printf('x=%d; y=%d',x,y); // на выходе: x=5; y=10
     change(x,y);
     printf('x=%d; y=%d',x,y); // на выходе: x=100; y=10
}
Это называется передача по ссылке.
Валентин Жуков
0 / 0 / 0
Регистрация: 23.01.2008
Сообщений: 126
24.04.2008, 10:11  [ТС] #3
Спасибо.
То есть в С++ без указателей и ссылок не обойтись?
И то что в процедуре на Паскале в качестве формальных
параметров стоит с меткой var :
proc_name(a:integer;var b:integer)
то в С++ стоит с меткой &:
proc_name(int a,int &b)?
А почему тогда написано в книгах, что в С++ параметры всегда передаются по ЗНАЧЕНИЮ, а в Паскале всегда по ССЫЛКЕ???
Помогите,плз.
0
AmbX
0 / 0 / 0
Регистрация: 21.12.2007
Сообщений: 122
24.04.2008, 11:03 #4
Указатели можно использовать для перемещения по адресам памяти :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#define teststr 'hellow world'
 
class a1
{
private:
char* str1;
char* str2;
public:
a1()
{
str1 = new char[strlen(teststr )+1];
memmove(str1,teststr,strlen(teststr));
str2 = str1 + strlen('hellow') + 2;
}
~a1()
{
if(str1)
delete[] str1;
}
};
void func1()
{
a1 testclass;
char* pointer;
pointer = (char*)&testclass;
cout<<pointer; // 'hellow world' - это a1::str2
pointer += sizeof(char*);
cout<<pointer; // 'world' - это a1::str2
 
}
Идея понятна ?
0
AmbX
0 / 0 / 0
Регистрация: 21.12.2007
Сообщений: 122
24.04.2008, 11:04 #5
Извеняюсь опечатка - в первом варианте str1
0
Валентин Жуков
0 / 0 / 0
Регистрация: 23.01.2008
Сообщений: 126
24.04.2008, 12:31  [ТС] #6
Спасибо.
Но почему все таки в книге написано,что в С и С++ параметры всегда передаются по значению?
0
AmbX
0 / 0 / 0
Регистрация: 21.12.2007
Сообщений: 122
24.04.2008, 12:51 #7
На самом деле когда передаются пораметры то происходит следующее :
C++
1
2
3
4
5
6
7
8
9
10
void func(int* locValP);
int* realValP;
*realValP = 5;
void func(int* locValP) // создается локальная переменная типа int*
{
*locValP = 10; // *realValP == 10
locValP = new int;
*locValP = 20; // *realValP == 10
}
func(realValP); // в функции создается локальная переменная типа int* в каторую копируется (ULong)locValP  -> адрес
Параметры действительно предаются по заначению
0
VVP
24.04.2008, 14:57 #8
2vzhookov: На самом деле и в паскале параметры ТОЖЕ передаются по значению, куда же без этого. Если вы в паскале напишете
Pascal
1
2
3
4
procedure proc(a: integer);
begin
...
end;
то переменная a будет передана по значению. В процессе передачи параметров с указанием var происходит передача ЗНАЧЕНИЯ указателя на значение, с которым вы работаете в исходнике как с переменной целого (в данном случае) типа. Другое дело (в дельфях), когда вы работаете с классами, там класс никогда не передается по значению (и соответственно не вызывается конструктор локальной копии).
В C++ указание для параметра необходимости передачи по ссылке '&', с логической точки зрение, абсолютно эквивалентно квалификатору 'var' параметра в паскале.
Так что единственное, что можно сказать: параметры всегда передаются по значению. Весь вопрос в том, что является реальным параметром.
В паскале вы можете сделать параметром указатель:
Pascal
1
2
3
4
5
6
7
8
type PInt=^integer;
procedure proc(a: PInt); 
 
procedure proc2;
var a: integer;
begin
  proc(@a); // передаем адрес переменой, значение адреса копируется в стек!!!
end;
это эквивалентно сишной записе void proc(int *a). И значение указателя будет передано по значению!!!
Вообще всегда при передаче параметров создается локальная копия передаваемого параметра в стеке. И еще раз - весь вопрос в том, что такое передаваемый параметр.
В своем большинстве работа с указателями в паскале и сях не отличается. А вот механизм ссылки более развит в С++, но это уже другая история.

Успехов.
Linear
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 6
11.05.2014, 14:37 #9
Указатели - это непосредственный метод работы с памятью
0
11.05.2014, 14:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2014, 14:37
Привет! Вот еще темы с ответами:

Ссылки и указатели - в чем преимущество одного над другим - C++
Известно, что главной причиной появления ссылок в С++ было дать более безопасную альтернативу указателям в некоторых ситуациях. Ссылка в...

Указатели на массивы: В чем принципиальное различие между объявлениями указателей? - C++
Вопрос по теории В чем принципиальное различие между данными обьявлениями? (+ правильно ли я понимаю, что 1и2, 3и4 это синонимы?) ...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.