Форум программистов, компьютерный форум CyberForum.ru

Указатели не могу понять - C++

Восстановить пароль Регистрация
 
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 19:40     Указатели не могу понять #1
Все вопросы указал в комментариях к коду. Не могу понять почему так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
int main()
{
    int *p, num;
 
    p = &num; //1). почему мы пишем p, а не *p(мы ведь объявили как *p)?
                        //2). Мы p присвоили адрес переменной num(её физический адрес)
 
    *p = 100; //тут мы уже p присваиваем значение 100
 
    cout << num << ' '; //3). почему у нас выводится 100, когда мы num не присваивали ничего?
    (*p)++;
    cout << num << ' ';
    (*p)--;
    cout << num << '\n';
 
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2012, 19:40     Указатели не могу понять
Посмотрите здесь:

Понять указатели:) C++
C++ Не могу понять зачем нужны указатели?
C++ Строки (массив char), указатели. Не могу понять логику! Help!
C++ Не могу понять
C++ не могу понять
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
29.09.2012, 19:47     Указатели не могу понять #2
Цитата Сообщение от aleksand Посмотреть сообщение
p = &num; //1). почему мы пишем p, а не *p(мы ведь объявили как *p)?
p - это указатель. он содержит в себе адрес какой-то переменной. А &num - это и есть адрес переменной num
*p - это само значение той переменной, на которую указывает указатель

Цитата Сообщение от aleksand Посмотреть сообщение
*p = 100; //тут мы уже p присваиваем значение 100
не совсем правильно в комментарии. правильнее будет "тут мы уже присваиваем той переменной на которую указывает указатель p значение 100". То есть косвенно изменяем значение переменной через указатель


Цитата Сообщение от aleksand Посмотреть сообщение
cout << num << ' '; //3). почему у нас выводится 100, когда мы num не присваивали ничего?
Переменная num была изменена через указатель p. Хотя саму переменную num даже и не трогали
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 20:09  [ТС]     Указатели не могу понять #3
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
p - это указатель. он содержит в себе адрес какой-то переменной. А &num - это и есть адрес переменной num
*p - это само значение той переменной, на которую указывает указатель


не совсем правильно в комментарии. правильнее будет "тут мы уже присваиваем той переменной на которую указывает указатель p значение 100". То есть косвенно изменяем значение переменной через указатель



Переменная num была изменена через указатель p. Хотя саму переменную num даже и не трогали
Ничего не понял. Совсем запутался.
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
29.09.2012, 20:15     Указатели не могу понять #4
* - разыменование
& - взятия адреса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int *p;//указатель
int num;//переменная
p = &num;//в указатель поместили адрес переменной num
num = 100;
cout << num;//выведет 100
cout << *p;//фактически "*" означает - покажи мне, что находиться в переменной на которую ты указываешь
//и если сделать вот так
(*p)++;
//значение переменной на которую ссылаеться указатель увеличиться
cout << num //даст 101
cout << *p //даст 101
//если же написать 
cout << p;
можно увидеть адрес на который ссылается
кажись все так)
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 20:16  [ТС]     Указатели не могу понять #5
Всё понял
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
29.09.2012, 20:18     Указатели не могу понять #6
Цитата Сообщение от aleksand Посмотреть сообщение
*p = 100; //тут мы присваиваем значение указателю p
присвоение не указателю, а переменной на которую он ссылаеться
если будет написано p = 100;
тогда да, указателю присвоен адрес 100 =)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2012, 20:30     Указатели не могу понять #7
Указатель - переменная, значением которой является адрес другой переменной. Знак *, при объявлении указателя, говорит о том, что переменная, перед которой он стоит, является переменной-указателем. В других случаях, этот знак перед указателем, означает операцию разыменования указателя, т.е. получение той переменной, адрес которой содержится в указателе. Например:
C++
1
2
3
int a = 4;
int *ptr = &a; указателю на int присваивается адрес переменной a
*ptr = 8; // разыменование указателя, т.е. получение переменной a и присвоение ей нового значения 8
При объявлении указателя, то что стоит слева от * относится к той переменной, адрес которой содержит указатель, а то, что стоит справа от *, к самой переменной-указателю.

Если указатель объявлен как указатель на константу:
C++
1
2
int a = 4;
const int *ptr = &a; // указателю на константу присваивается адрес переменной a
, то через такой указатель нельзя изменять переменную, адрес которой он содержит. Например, такой код вызовет ошибку:
C++
1
*ptr = 5;
Указатель на константу может быть только константным.

Такая запись:

C++
1
int *const ptr = &a;
говорит о том, что объявляется константный указатель на неконстантную переменную int, и ему присваивается адрес переменной a. Значение такого указателя нельзя менять. То есть, попытка присвоить такому указателю какой-нибудь другой адрес вызовет ошибку. Например:

C++
1
2
3
4
int a = 4;
int b = 6;
int *const ptr = &a;
ptr = &b; // ошибка
Указатель на указатель - это переменная, значением которой является адрес переменной-указателя. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a = 4;
int *ptr = &a; // ptr - переменная-указатель на itn. Содержит адрес переменной а.
int **ptrptr = &ptr; // ptrptr - переменная-указатель на указатель на int. Содержит адрес ptr, переменной-указателя на int
 
int a = 4;
int b = 5;
int *ptr = &a; 
int **ptrptr = &ptr;
*ptr = 8; // а присваиваем 8
**ptrptr = 8; //  то же самое
ptr = &b; // переменной-указателю  на int - ptr присваиваем другое значение, адрес перменной b
*ptrptr = &b; // то же самое
int d = 2;
int *ptrd = &d; 
ptrptr = &ptrd; // указателю на указатель на int - ptrptr присваивается новое значение, адрес указателя ptrd
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
29.09.2012, 20:36     Указатели не могу понять #8
aleksand, указатель есть данное, хранящее адрес другой информации. Если это указатель на данные, то при описании к имени типа добавляется звёздочка, она же добавляется к самому указателю, чтоб по нему получить доступ к данному, на которое он указывает, но уже слева, а чтоб из любого данного взять адрес самого данного, к имени добавляется аперсанд слева.
Tigran84
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 2
25.05.2014, 00:03     Указатели не могу понять #9
fgggh

Добавлено через 3 минуты
не могу понять как может *&aPtr и &*aPtr быть одно и тоже
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.05.2014, 00:20     Указатели не могу понять #10
Можно не понимать, а считать, что взятие адреса и разыменование - это противоположные операции, тогда два действия: *& и &*, равнозначны тому, что ничего не делается (можно просто убрать). Тогда *&aPtr и &*aPtr, равнозначны aPtr и aPtr.
Tigran84
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 2
26.05.2014, 22:01     Указатели не могу понять #11
меня интересюет как работает функция * он оперирует со андресом указателя или с его значением, если он берет адрес указателя и ссылается на число которое находистца в указателе тоист его значение, если ето так то по моемы вся понятно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2014, 22:14     Указатели не могу понять
Еще ссылки по теме:

Стек на основе массива структур - эт как понять читаю литературу и не могу понять! C++
C++ не могу понять
C++ Символьные литералы, указатели и функция. Не могу понять, почему именно так

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

Или воспользуйтесь поиском по форуму:
Drusha
6 / 6 / 0
Регистрация: 16.07.2013
Сообщений: 74
26.05.2014, 22:14     Указатели не могу понять #12
Объявление указателя:
int* a;
Указатель может хранить только адрес переменной на которую он указывает, этот адрес берется с помощью &:
int b= 10;
a = &b;
Сейчас в переменной а хранится только адрес переменной b, что бы получить доступ к значению переменной b использую операцию разыменовывания *:
cout << *a;
Выведет на экран число 10;
А вообще попробуйте набрать это и вконце дописать cout << a << ' ' << *a; и думаю сразу станет все понятно
Главное не путать операцию объявление указателя и операцию разыменовывания, просто и там и там участвует *
Yandex
Объявления
26.05.2014, 22:14     Указатели не могу понять
Ответ Создать тему
Опции темы

Текущее время: 18:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru