Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086

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

06.03.2014, 14:49. Показов 1753. Ответов 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;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2014, 14:49
Ответы с готовыми решениями:

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

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

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

15
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,646
Записей в блоге: 6
06.03.2014, 15:00
А в чем вопрос то?
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.03.2014, 16:17
EVG-1980, у Вас нет глобальной переменной. Есть локальные, с разным уровнем вложенности.
Вместо указателя можно использовать ссылку. Хотя правильнее было бы, просто давать разные имена.
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.03.2014, 17:05  [ТС]
как я понял из чтива, указатели есть смысл использовать тогда когда имеется большой объем данных и что бы не тратить время на копирование этих данных из одной области памяти в другую.

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

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

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

C++
1
delete p;
компилируется без ошибок но почему при исполнении виснет?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.03.2014, 17:27
Цитата Сообщение от 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.
1
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.03.2014, 17:37  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
int &p = test;
Я правильно понимаю мы по адресу переменной p кладем значение переменной тест?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.03.2014, 17:40
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Я правильно понимаю мы по адресу переменной p кладем значение переменной тест?
нет. p - это синоним для test в данном случае. В итоговом коде, скорее всего, никакой переменной p не будет вовсе. Ознакомьтесь, что такое ссылочная переменная в любой книжке по C++.
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.03.2014, 20:08  [ТС]

Не по теме:

ознакомлюсь как закачается Харви Дейтел, Пол Дейтел Как программировать на 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;
}
Кто пояснит результаты?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
06.03.2014, 20:19
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кто пояснит результаты?
если коротко, то вы написали полную херню, сначала
Цитата Сообщение от EVG-1980 Посмотреть сообщение
ознакомлюсь как закачается Харви Дейтел, Пол Дейтел Как программировать на C++
ознакомьтесь, а потом пишите
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.03.2014, 20:24  [ТС]
Jupiter, ну пояснение то можно дать, я же не прошу решить лабу нахаляву, а хочу понять
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.03.2014, 20:43
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кто пояснит результаты?
Чтобы как-то пояснять результаты, надо хотя бы знать цель, которую хотите достичь. И если уж речь о результате, то неплохо бы его представить.
И каким боком текущий код относится к теме?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
06.03.2014, 20:48
окей, пункт 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 это часть стандартной библиотеки т.е. кем-то написанный код, вы же берете адрес объекта чужого класса (чужого так как не вы его писали) и не зная его внутреннего представления начинаете менять его внутренности через указатель, конкретных пояснений по результату тут дать нельзя, так как вы делаете неправильно нарушаете закон, и конечный результат зависит от платформы(компилятора, ОС и т.д.) законы у всех разные
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
06.03.2014, 21:08  [ТС]
Jupiter, да забыл написань using namespace std; в программе есть

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

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

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

Не по теме:

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

0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
06.03.2014, 21:20
Цитата Сообщение от EVG-1980 Посмотреть сообщение
По мне так я получаю адрес первого символа строки
адрес первого символа &str[0] и совсем не факт что он будет совпадать с &str

Цитата Сообщение от EVG-1980 Посмотреть сообщение
перехожу ко второму и меняю второй символ (в первом случае он не меняется как я понял потому что символы храняться в памяти неупорядоченно)
до стандарта С++11 никаких гарантий что символы string это массив т.е. непрерывная область памяти - нет, но стандарты стадартами, а де-факто std::string это массив в большинстве реализаций
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2014, 21:44
http://cpp.com.ru/meyers/ch2.html
Совет 15. Помните о различиях в реализации string
0
06.03.2014, 21:59

Не по теме:

Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кстати язык мне начинает нравится
Хорошо бы ещё чтоб русский язык тоже не был обделён.
Цитата Сообщение от EVG-1980 Посмотреть сообщение
и поменять все что угодно и пофигу на privat и const
Интересно зачем? Может просто взять Си?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2014, 21:59
Помогаю со студенческими работами здесь

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

Область видимости
Здравствуйте. Вот кусок кода int *s; int *m() { int k = 12345; s = &amp;k; return &amp;k; }

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru