Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
1

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

29.09.2012, 19:40. Показов 1389. Ответов 11
Метки нет (Все метки)

Все вопросы указал в комментариях к коду. Не могу понять почему так
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;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2012, 19:40
Ответы с готовыми решениями:

Не могу понять зачем нужны указатели?
Не как не могу понять зачем нужны указатели. Я знаю что их надо использовать для выделения памяти,...

Строки (массив char), указатели. Не могу понять логику! Help!
Вообщем проблема в том что выводятся лишние символы в строках.. хотя в них есть признак окончания...

Символьные литералы, указатели и функция. Не могу понять, почему именно так
Доброго времени суток всем! :) Изучаю С++, всегда стараюсь добить до последнего код, чтобы не...

Не могу понять, как "живут" файловые указатели
Не могу понять как живут файловые указатели... Есть у меня файл, и пишу в него 100 интов....

11
422 / 387 / 113
Регистрация: 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 даже и не трогали
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 20:09  [ТС] 3
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
p - это указатель. он содержит в себе адрес какой-то переменной. А &num - это и есть адрес переменной num
*p - это само значение той переменной, на которую указывает указатель


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



Переменная num была изменена через указатель p. Хотя саму переменную num даже и не трогали
Ничего не понял. Совсем запутался.
0
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
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;
можно увидеть адрес на который ссылается
кажись все так)
1
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
29.09.2012, 20:16  [ТС] 5
Всё понял
1
250 / 232 / 46
Регистрация: 05.02.2010
Сообщений: 3,288
29.09.2012, 20:18 6
Цитата Сообщение от aleksand Посмотреть сообщение
*p = 100; //тут мы присваиваем значение указателю p
присвоение не указателю, а переменной на которую он ссылаеться
если будет написано p = 100;
тогда да, указателю присвоен адрес 100 =)
0
5480 / 4875 / 831
Регистрация: 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
0
4200 / 1792 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.09.2012, 20:36 8
aleksand, указатель есть данное, хранящее адрес другой информации. Если это указатель на данные, то при описании к имени типа добавляется звёздочка, она же добавляется к самому указателю, чтоб по нему получить доступ к данному, на которое он указывает, но уже слева, а чтоб из любого данного взять адрес самого данного, к имени добавляется аперсанд слева.
1
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 2
25.05.2014, 00:03 9
fgggh

Добавлено через 3 минуты
не могу понять как может *&aPtr и &*aPtr быть одно и тоже
0
5480 / 4875 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
25.05.2014, 00:20 10
Можно не понимать, а считать, что взятие адреса и разыменование - это противоположные операции, тогда два действия: *& и &*, равнозначны тому, что ничего не делается (можно просто убрать). Тогда *&aPtr и &*aPtr, равнозначны aPtr и aPtr.
0
0 / 0 / 0
Регистрация: 17.05.2014
Сообщений: 2
26.05.2014, 22:01 11
меня интересюет как работает функция * он оперирует со андресом указателя или с его значением, если он берет адрес указателя и ссылается на число которое находистца в указателе тоист его значение, если ето так то по моемы вся понятно
0
6 / 6 / 1
Регистрация: 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; и думаю сразу станет все понятно
Главное не путать операцию объявление указателя и операцию разыменовывания, просто и там и там участвует *
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2014, 22:14

Стек на основе массива структур - эт как понять читаю литературу и не могу понять!
Стек статически (на основе массива структур). Пример структура &quot;Товар&quot; которая включает в себя: №...

Понять указатели:)
Добрый день! Совсем недавно начал изучать С++, в основном по методичке, выданной в ВУЗе и по...

Не могу сделать полиморфизм. Не могу до конца понять пример по этому поводу
Есть такая задача: Класс Animal должен быть абстрактным, имеет имя и вес. Класс Reptile имеет...

Не могу понять почему не могу считать символьный ряд через cin.getline
Не могу понять почему не могу считать символьный ряд через cin.getline.Помогите позязя. #define ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru