Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.01.2012, 23:36   #1
over96
 
Аватар для over96
 
Регистрация: 08.01.2012
Сообщений: 5
По умолчанию Переменные, ссылки и указатели. Правильно ли я их понимаю?

Здраствуйте. Сейчас будет небольшой поток мыслей - мои рассуждения. Я начинающий в изучении с++ и только школьник. Поэтому пожалуйста объясняйте мне что я дятел не очень грубо.

Правильно ли я понимаю, что переменная - это упрощённый указатель. Тоесть указатель можно направлять на другую ячейку памяти - а переменную нельзя. С указателем можно делать всё то же что и с переменной, однако память выделенную под указатели можно вручную удалять, а не как в переменной - когда она выйдет из своей области видимости(или как то так). С ссылками вроде все понятно, тот же указатель, но с упрощённым раз@#!именованием.
Теперь по сути вопросы:

1)правильно ли всё это?

2)"однако память выделенную под указатели можно вручную удалять, а не как в переменной - когда она выйдет из своей области видимости(или как то так)" - Или под указатели выделяется другая память?

3) И можно ли удалять указатель, который мы не создавали оператором new(), а который указали способом вроде int *pa = a;

4)Вообщем у меня путанница с технической стороной того, что происходит в компе когда мы объявляем переменную или создаём указатель, там какая-то статическая и динамическая память. Объясните это подробно но "на пальцах".

ЗАРАНЕЕ СПАСИБО ОГРОМНОЕ!!!
over96 вне форума Ответить с цитированием
Старый 11.01.2012, 01:28   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Просто переменная, скажем к примеру int Var = 0; это не упрощенный указатель, это автоматически выделенная стеком область памяти, где освобождением этой памяти занимается тот же стек.
Указатель, скажем к пример int *pVar = new int [10]; это динамическое в моем случае выделенная последовательность байт (быть точнее последовательность двойного слова) и освобождением этой памяти мы должны заниматься в ручную. То есть после того как данный динамический массив был использован соответственно память должна быть освобождена. delete [] pVar;

п.с./ Почему двойное слово? Потому что, тип int занимает в памяти 4 байта. (DWORD)
Память представляется следующими типами данных: BYTE, WORD, DWORD
BYTE = 8 бит
WORD = 16 бит
DWORD = 32 бит

Я скажем так, программист любитель, поэтому могу и ошибаться. На счет ссылок это уклон уже в ООП. Взято на Вики, ссылка — это простой ссылочный тип, менее мощный, но более безопасный, чем указатель, унаследованый от языка Си.
Несколько примеров с ссылками:

int A = 5;
int& rA = A;
extern int& rB;
int& foo ();
void bar (int& rP);
class MyClass { int& m_b; /* ... */ };
int funcX() { return 42 ; }; int (&xFunc)() = funcX;

А вообще я примерно догадываюсь что ты не понимаешь и в чем твоя проблема, так как когда-то имел такую же проблему.
Давай представим что у нас есть массив и указатель на массив.

Код:

void MyFunc(int *pArr)
{
 pArr[0] = 10;
 pArr[1] = 11;
 pArr[2] = 12;
}

int main(void)
{
 int Arr[3] = { 1, 2, 3 }; /* Объявляем здесь массив и сразу его инициализируем 3-мя значениями */
 
 int *pArr = &Arr[0]; /* Здесь объявляем указатель и присваиваем адрес массива указателю. */
 
 MyFunc(pArr); /* Здесь вызовем функцию и передадим параметрам наш указатель данной функции. */

 /* Заметь какой массив я пытаюсь вывести на экран, то есть обрати внимание, все изменения над указателем изменяли и наш статичный массив. Очень удобная штука, по внимательнее по вникай в мой примерчик, думаю немного для себя вкуришь. И это еще не все что можно  творить с указателем. Очень удобная штука :) */
 printf("%d %d %d", Arr[0], Arr[1], Arr[2]); // Результатом вывода на экран будет 10, 11, 12;
 return 0;
}
Собственно с ссылками происходит практически аналогичная ситуация что и с указателем.

Последний раз редактировалось coNsept; 11.01.2012 в 01:53.
coNsept вне форума Ответить с цитированием
Старый 11.01.2012, 01:44   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
Код:
int *pArr = &Arr;
пытаешься присвоить указателю на инт указатель на массив интов из 3-х элементов
Код:
int *pArr = &Arr[0];
или
int *pArr = Arr;
Код:
 printf("%d %d %d", &Arr[0], &Arr[1], &Arr[2]); // Результатом вывода на экран будет 10, 11, 12;
адреса собираешься выводить, а не значения
Код:
 printf("%d %d %d", Arr[0], Arr[1], Arr[2]);
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 11.01.2012, 01:58   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Мистер proger веселей, с ним все гораздо быстрей
Oops, да простите, писал в printf а думал о scanf и за остальные исправления сэнкс.
&Arr[0] - собственно это безусловно звучит правильнее указатель на массив интов из трех элементов. Ну а разве передачей адреса массива это нельзя назвать? (Как бэ по проще)
coNsept вне форума Ответить с цитированием
Старый 11.01.2012, 02:04   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2coNsept
Цитата:
Ну а разве передачей адреса массива это нельзя назвать? (Как бэ по проще)
адресом массива обычно считают адрес первого элемента в массиве. ты же писал так
Код:
int Arr[3] = { 1, 2, 3 };
int *pArr = &Arr;
что как раз называется указателем на массив из 3-х элементов типа инт. и это не взаимозаменяемые понятия

Код:
int Arr[3] = { 1, 2, 3 };
int (*pArr)[3] = &Arr;
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели vs ссылки Aistn Общие вопросы C/C++ 9 01.06.2011 23:02
Динамические переменные и указатели DjedayD Паскаль, Turbo Pascal, PascalABC.NET 0 03.05.2011 09:16
ссылки и указатели. mojohead Помощь студентам 13 14.01.2011 16:00
Указатели и переменные в функциях. Alexcomeback Общие вопросы C/C++ 6 28.09.2009 20:11
Правильно ли я понимаю справку Ексель? Помогите! abdumanon Microsoft Office Excel 9 09.04.2009 19:36