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

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

Войти
Регистрация
Восстановить пароль
 
 
EVG-1980
162 / 162 / 33
Регистрация: 11.04.2013
Сообщений: 886
#1

Область видимости и указатели - C++

06.03.2014, 14:49. Просмотров 610. Ответов 15
Метки нет (Все метки)

Разбираю пример

Иногда возникают ситуации, когда значение локальной переменной за пределами блока, в котором она объявлена. Как быть в этом случае? Здесь нам и пригодятся указатели.


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
31
32
int main()
{
    int test;
    int test_loop;
    int *p;
 
    p = &test_loop;
    cout << "Результат выполнения данной программы:\n\n"
           << "Введите значение глобальной переменной test: ";
    cin >> test;
    cout << "\nЗначение глобальной переменной test до выполнения цикла: "
           << test << "\n\n";
 
    for(int i=0;i<1;i++)
    {
        int test;
        cout << "Введите значение локальной переменной test: ";
        cin >> test;
        *p = test;
        cout << "\nЗначение локальной переменной test в цикле: "
               << test << "\n\n";
    }
 
    cout << "Значение глобальной переменной test после выполнения "
           << "цикла: " << test << "\n\n"
           << "Значение локальной переменной test в цикле: "
           << test_loop << "\n\n";
 
    cout << "\n\n";
    system("PAUSE");
    return 0;
}

Не по теме:

Результат выполнения данной программы:

Введите значение глобальной переменной test: 10

Значение глобальной переменной test до выполнения цикла: 10

Введите значение локальной переменной test: 35

Значение локальной переменной test в цикле: 35

Значение глобальной переменной test после выполнения цикла: 10

Значение локальной переменной test в цикле: 35



Почему именно здесь нам пригодятся указатели?

Почему нам здесь не пригодится ?
C++
1
test_loop=test;
И кода будет на 2 строчки меньше
C++
1
int *p;    p = &test_loop;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2014, 14:49     Область видимости и указатели
Посмотрите здесь:

Область видимости - C++
Даю фрагмент программы: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; struct elem //тип элемента двусвязного списка ...

Область видимости - C++
Здравствуйте. Тут такое дело: #include &lt;vector&gt; class SomeClass { public: SomeClass( std::vector&lt; int &gt; v ) : vec( v ) {} ...

Область видимости - C++
У меня возникла проблема с областью видимости. вот у меня два класса class Obj { public: Win *parent;

Область видимости в С++ - C++
В книге С++ Бархатный путь. ( http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/cppvw/cpp_047.html) сказано, что область действия имен...

Область видимости - C++
func { int someVariable; { int someVariable; //можно ли как нибудь получить доступ к переменной...

Область видимости в библиотеках - C++
Есть 2 либы с одинаковыми классами Первая: ----file t1.h ----- #ifndef LOG1_H #define LOG1_H #include &lt;string&gt;

Область видимости переменных - C++
Здравствуйте. Столкнулся со следующей проблемой: есть файл main.cpp: int a, b; #include &quot;class.h&quot; int main() { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1807 / 1164 / 226
Регистрация: 16.05.2013
Сообщений: 3,060
Записей в блоге: 5
Завершенные тесты: 1
06.03.2014, 15:00     Область видимости и указатели #2
А в чем вопрос то?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.03.2014, 16:17     Область видимости и указатели #3
EVG-1980, у Вас нет глобальной переменной. Есть локальные, с разным уровнем вложенности.
Вместо указателя можно использовать ссылку. Хотя правильнее было бы, просто давать разные имена.
EVG-1980
162 / 162 / 33
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 17:05  [ТС]     Область видимости и указатели #4
как я понял из чтива, указатели есть смысл использовать тогда когда имеется большой объем данных и что бы не тратить время на копирование этих данных из одной области памяти в другую.

Кстати в данном примере уровня видимости int test_loop вполне достаточно

Цитата Сообщение от Tulosba Посмотреть сообщение
Вместо указателя можно использовать ссылку.
можно пример касательно данного кода?

И еще вопросик если в конце поставить

C++
1
delete p;
компилируется без ошибок но почему при исполнении виснет?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.03.2014, 17:27     Область видимости и указатели #5
Цитата Сообщение от EVG-1980 Посмотреть сообщение
можно пример касательно данного кода?
C++
1
2
3
4
5
int &p = test;
{
   int test; 
   std::cout << p; // внешний test
   std::cout << test; // внутренний test
Цитата Сообщение от EVG-1980 Посмотреть сообщение
компилируется без ошибок но почему при исполнении виснет?
Потому что удалять память при помощи delete нужно только когда она выделялась через new.
EVG-1980
162 / 162 / 33
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 17:37  [ТС]     Область видимости и указатели #6
Цитата Сообщение от Tulosba Посмотреть сообщение
int &p = test;
Я правильно понимаю мы по адресу переменной p кладем значение переменной тест?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.03.2014, 17:40     Область видимости и указатели #7
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Я правильно понимаю мы по адресу переменной p кладем значение переменной тест?
нет. p - это синоним для test в данном случае. В итоговом коде, скорее всего, никакой переменной p не будет вовсе. Ознакомьтесь, что такое ссылочная переменная в любой книжке по C++.
EVG-1980
162 / 162 / 33
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 20:08  [ТС]     Область видимости и указатели #8

Не по теме:

ознакомлюсь как закачается Харви Дейтел, Пол Дейтел Как программировать на C++



Добавлено через 2 часа 24 минуты
Начинаю недопонимать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <iostream>
#include <locale> 
int _tmain(int argc, _TCHAR* argv[])
{
    string str ="w1234ввв";
    
    char* u;
    
    u =(char*)&str;
    u++;
    *u='j';
    setlocale(LC_ALL, "");
    cout<<*u<<endl; cout<<&u<<endl;
    cout<<str<<endl;
    u =(char*)str.c_str() ;
    u++;
    *u='j';
    cout<<*u<<endl; cout<<&u<<endl;
    cout<<str<<endl;
    cin.get();
    return 0;
}
Кто пояснит результаты?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.03.2014, 20:19     Область видимости и указатели #9
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кто пояснит результаты?
если коротко, то вы написали полную херню, сначала
Цитата Сообщение от EVG-1980 Посмотреть сообщение
ознакомлюсь как закачается Харви Дейтел, Пол Дейтел Как программировать на C++
ознакомьтесь, а потом пишите
EVG-1980
162 / 162 / 33
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 20:24  [ТС]     Область видимости и указатели #10
Jupiter, ну пояснение то можно дать, я же не прошу решить лабу нахаляву, а хочу понять
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.03.2014, 20:43     Область видимости и указатели #11
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кто пояснит результаты?
Чтобы как-то пояснять результаты, надо хотя бы знать цель, которую хотите достичь. И если уж речь о результате, то неплохо бы его представить.
И каким боком текущий код относится к теме?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.03.2014, 20:48     Область видимости и указатели #12
окей, пункт 1-й
Цитата Сообщение от EVG-1980 Посмотреть сообщение
string
что это за string? я догадываюсь что это std::string, если да то где подключен соответствующий хедер-файл? и где указание на использование пространства имен std ? все эти вопросы уже дают повод сомневаться в компилируемости кода

пункт 2-й исходя из предположений пункта 1
Цитата Сообщение от EVG-1980 Посмотреть сообщение
C++
1
2
3
4
char* u;
u =(char*)&str;
u++;
*u='j';
Цитата Сообщение от EVG-1980 Посмотреть сообщение
C++
1
2
3
u =(char*)str.c_str() ;
u++;
*u='j';
указатели - это часть языка, а std::string это часть стандартной библиотеки т.е. кем-то написанный код, вы же берете адрес объекта чужого класса (чужого так как не вы его писали) и не зная его внутреннего представления начинаете менять его внутренности через указатель, конкретных пояснений по результату тут дать нельзя, так как вы делаете неправильно нарушаете закон, и конечный результат зависит от платформы(компилятора, ОС и т.д.) законы у всех разные
EVG-1980
162 / 162 / 33
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 21:08  [ТС]     Область видимости и указатели #13
Jupiter, да забыл написань using namespace std; в программе есть

По мне так я получаю адрес первого символа строки , перехожу ко второму и меняю второй символ (в первом случае он не меняется как я понял потому что символы храняться в памяти неупорядоченно)

А как правильно?

Добавлено через 9 минут

Не по теме:

Кстати язык мне начинает нравится, можно залезть и поменять все что угодно и пофигу на privat и const

Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.03.2014, 21:20     Область видимости и указатели #14
Цитата Сообщение от EVG-1980 Посмотреть сообщение
По мне так я получаю адрес первого символа строки
адрес первого символа &str[0] и совсем не факт что он будет совпадать с &str

Цитата Сообщение от EVG-1980 Посмотреть сообщение
перехожу ко второму и меняю второй символ (в первом случае он не меняется как я понял потому что символы храняться в памяти неупорядоченно)
до стандарта С++11 никаких гарантий что символы string это массив т.е. непрерывная область памяти - нет, но стандарты стадартами, а де-факто std::string это массив в большинстве реализаций
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 21:44     Область видимости и указатели
Еще ссылки по теме:

Область видимости в классах - C++
Почему следующий пример выдает такой результат: Bar::testPrivate Bar::testPublic Я полагал он должен вывести: ...

Область видимости переменной - C++
Пожалуйста проясните новичку почему следующий код выводит сообщение messagebeer вместо message ? ]:-&gt;. Я только осваиваю язык поэтому хочу...

Область видимости Protected - C++
Еcть некий класс player и есть в нем переменная id в области паблик. Есть второй класс team который использует эту переменную. Пjка эти...

Область видимости struct - C++
Пытаюсь создать проект, в котором была бы &quot;глобальная&quot; проинициализированная структура, что бы ею можно было воспользоваться в функции...

Structure (Область видимости) - C++
struct.cpp:38:13: ошибка: нет декларации «TechnicalType» в этой области видимости помогите поправить :c 38 строка // //Failname:...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2014, 21:44     Область видимости и указатели #15
http://cpp.com.ru/meyers/ch2.html
Совет 15. Помните о различиях в реализации string
Yandex
Объявления
06.03.2014, 21:44     Область видимости и указатели
Ответ Создать тему
Опции темы

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