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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.74
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
#1

Чем отличаются указатели от ссылок? - C++

17.01.2013, 15:05. Просмотров 5615. Ответов 16
Метки нет (Все метки)

Как я понимаю указатель,он хранит адрес переменной,а ссылка просто берёт значение переменной?Привидите примерчик какой=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2013, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем отличаются указатели от ссылок? (C++):

Чем отличаются операторы while и for? - C++
Добрый вечер, чем отличается while от for, в каких случаях нужно использовать while а в каких for?

чем отличаются static_cast от - C++
Привет всем! чем отличаются явное приведения типа long tmp = static_cast<long>(45.6); от long tmp = long(54.34); ?

Чем отличаются компиляторы? - C++
Здравствуйте. 32-bit / 64-bit -- Понятно. Чем отличается threads-win32 от threads-posix, dwarf от sjlj?

Чем отличаются эти функции? - C++
Аргумент в первой функции передается по значению. Это значит что создается копия переменной. А вот остальные не понимаю. void f1(int...

Чем отличаются операторы вывода? - C++
Чем отличаются операторы вывода cout и printf и какой более перспективно использовать? ;)

Чем отличаются dynamic_cast и static_cast? - C++
если можно пример напишите

16
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.01.2013, 15:08 #2
Цитата Сообщение от faLek Посмотреть сообщение
ссылка просто берёт значение переменной
Ссылка это как-бы другое имя для переменной.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
void foo1(int x){
    x=10;
}
void foo2(int * x){
    *x=100;
}
void foo3(int & x){
    x=1000;
}
 
int main(){
    int x=0;
    foo1(x);
    std::cout<<x<<std::endl;
    foo2(&x);
    std::cout<<x<<std::endl;
    foo3(x);
    std::cout<<x<<std::endl;
    return 0;
}
1
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
17.01.2013, 15:11  [ТС] #3
Croessmah, ну это да,а могли бы вы ещё пояснить,мне отличие обычной переменной и переменной при помощи указателя,вот про массивы я понимаю для чего указатели,а в остальных случаях,почему лучше использовать указатель?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.01.2013, 15:12 #4
Ссылка — неявный указатель. Ей нельзя присвоить адрес другой переменной, ей нельзя присвоить какой-то "следующий адрес" (никакой адресной арифметики), ей нельзя присвоить "никакой" адрес (null). Отсюда и свойства: не надо какой-то специальной операции разыменования, она выполняется неявно; ссылки можно создавать только сразу инициалированными; ссылки можно оптимизировать — не хранить этот самый адрес физически в виде переменной, а сразу подставлять при компиляции, если это возможно.

Указатель стоит использовать, если 1) идёт работа с динамической памятью (там переменные создаются на лету); 2) надо адресная арифметика; 3) надо физически хранить адрес и иметь возможность его изменять; 4) совместимость.
1
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
17.01.2013, 16:17  [ТС] #5
Пусть p1 указатель на переменную с текущим значением 1000,я хочу ,чтобы вывело 1004,посмотреть указатель на следующее int-значение...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int main(){
 
    int *p1 = 0,p = 1000;
    p = *p1;
    p++;
    
    cout<<p;
 
    system("pause");
    return 0;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.01.2013, 16:29 #6
Цитата Сообщение от faLek Посмотреть сообщение
посмотреть указатель на следующее int-значение...
Оно будет лишь интерпретировано, как int.

Цитата Сообщение от faLek Посмотреть сообщение
на переменную с текущим значением 1000,я хочу ,чтобы вывело 1004
C++
1
2
3
int *p1 = 0,p = 1000; 
p = *p1; 
p++;
т.к. p имеет тип int, то p++:
p=1
0
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
17.01.2013, 16:31  [ТС] #7
а как сделать ,чтобы указатель уже указывал на следующее значение,т.е. сразу при икременттировании вывел 1004?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.01.2013, 16:36 #8
Цитата Сообщение от faLek Посмотреть сообщение
а как сделать ,чтобы указатель уже указывал на следующее значение,т.е. сразу при икременттировании вывел 1004?
Вы выводите переменную p, а она имеет тип int.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>
int main(){
    int t=1000;
    int* p=&t;
 
    for(int i=0;i<10;++i){
        std::cout<<std::setw(12)<<*(p+i)<<std::setw(12)<<(p+i)<<std::endl;
    }
    return 0;
}
0
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
17.01.2013, 16:38  [ТС] #9
только взятием адреса у какой-то переменной можно инициализировать указатель?
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.01.2013, 16:40 #10
Цитата Сообщение от faLek Посмотреть сообщение
только взятием адреса у какой-то переменной можно инициализировать указатель?
Можно и в ручную адрес забить, только что из этого выйдет?
0
TrueBit
96 / 96 / 12
Регистрация: 19.11.2012
Сообщений: 195
17.01.2013, 16:40 #11
Цитата Сообщение от faLek Посмотреть сообщение
Croessmah, ну это да,а могли бы вы ещё пояснить,мне отличие обычной переменной и переменной при помощи указателя,вот про массивы я понимаю для чего указатели,а в остальных случаях,почему лучше использовать указатель?
Если у вас большая структура данных и каждый раз её передавать целиком в функцию, то будут большие затраты памяти и стека. Передавая структуру по указателю, вы передаете лиш адрес вашей структуры, что при водит к экономии памяти и стека.
0
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
17.01.2013, 16:43  [ТС] #12
Croessmah, чушь=)
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
17.01.2013, 17:01 #13
Цитата Сообщение от faLek Посмотреть сообщение
Croessmah, чушь=)
Вручную имеет смысл забивать указатель NULL это очень хороший указатель.
Например если у вас есть переменная int x = 0 это не значит, что она пустая, 0 это может быть важное значение. И какое нам занести в переменную значение, которое покажет, что переменную нельзя использовать?
А вот если int *x = NULL то можно совершенно с уверенностью сказать, что переменная по адресу х не содержит полезных данных.
0
faLek
99 / 100 / 7
Регистрация: 06.03.2012
Сообщений: 478
17.01.2013, 17:04  [ТС] #14
UserAK, ну это знал и понимал,немного другое имел ввиду))))))
0
UserAK
73 / 73 / 4
Регистрация: 25.12.2012
Сообщений: 189
Записей в блоге: 2
17.01.2013, 17:16 #15
к счастью, если кто-то обманет компилятор и запихает-таки в адрес эту самую чушь, то у него должно хватить мудрости этого не делать
0
17.01.2013, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2013, 17:16
Привет! Вот еще темы с ответами:

Чем отличаются ф-ии GlobalAllocPtr() и malloc()? - C++
Здрасьте! Чем отличаются ф-ии GlobalAllocPtr() и malloc()? Спасибо!

Чем отличаются функции cprintf и printf? - C++
подскажи чем отличаются функции cprintf и printf

Чем hpp-файлы отличаются от h-файлов? - C++
hpp файлы чем нибудь отличаются от обычных h-ников? или только в расширении разница?

а как вам это чем отличаются - C++
10)Литералы 33 и 33L Выберите один ответ. не отличаются отличаются значением отличаются типом одно из них...


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

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

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