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

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

Восстановить пароль Регистрация
 
EVG-1980
161 / 161 / 32
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 14:49     Область видимости и указатели #1
Разбираю пример

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


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++
Область видимости C++
C++ Область видимости
Область видимости C++
C++ Область видимости Protected
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 222
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
06.03.2014, 15:00     Область видимости и указатели #2
А в чем вопрос то?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.03.2014, 16:17     Область видимости и указатели #3
EVG-1980, у Вас нет глобальной переменной. Есть локальные, с разным уровнем вложенности.
Вместо указателя можно использовать ссылку. Хотя правильнее было бы, просто давать разные имена.
EVG-1980
161 / 161 / 32
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 17:05  [ТС]     Область видимости и указатели #4
как я понял из чтива, указатели есть смысл использовать тогда когда имеется большой объем данных и что бы не тратить время на копирование этих данных из одной области памяти в другую.

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

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

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

C++
1
delete p;
компилируется без ошибок но почему при исполнении виснет?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
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
161 / 161 / 32
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 17:37  [ТС]     Область видимости и указатели #6
Цитата Сообщение от Tulosba Посмотреть сообщение
int &p = test;
Я правильно понимаю мы по адресу переменной p кладем значение переменной тест?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.03.2014, 17:40     Область видимости и указатели #7
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Я правильно понимаю мы по адресу переменной p кладем значение переменной тест?
нет. p - это синоним для test в данном случае. В итоговом коде, скорее всего, никакой переменной p не будет вовсе. Ознакомьтесь, что такое ссылочная переменная в любой книжке по C++.
EVG-1980
161 / 161 / 32
Регистрация: 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
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.03.2014, 20:19     Область видимости и указатели #9
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кто пояснит результаты?
если коротко, то вы написали полную херню, сначала
Цитата Сообщение от EVG-1980 Посмотреть сообщение
ознакомлюсь как закачается Харви Дейтел, Пол Дейтел Как программировать на C++
ознакомьтесь, а потом пишите
EVG-1980
161 / 161 / 32
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 20:24  [ТС]     Область видимости и указатели #10
Jupiter, ну пояснение то можно дать, я же не прошу решить лабу нахаляву, а хочу понять
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
06.03.2014, 20:43     Область видимости и указатели #11
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Кто пояснит результаты?
Чтобы как-то пояснять результаты, надо хотя бы знать цель, которую хотите достичь. И если уж речь о результате, то неплохо бы его представить.
И каким боком текущий код относится к теме?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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
161 / 161 / 32
Регистрация: 11.04.2013
Сообщений: 886
06.03.2014, 21:08  [ТС]     Область видимости и указатели #13
Jupiter, да забыл написань using namespace std; в программе есть

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

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

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

Не по теме:

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

Jupiter
Каратель
Эксперт C++
6542 / 3962 / 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 это массив в большинстве реализаций
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.03.2014, 21:44     Область видимости и указатели #15
http://cpp.com.ru/meyers/ch2.html
Совет 15. Помните о различиях в реализации string
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 21:59     Область видимости и указатели
Еще ссылки по теме:

C++ Область видимости
C++ Область видимости переменных
C++ Область видимости в библиотеках

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

Или воспользуйтесь поиском по форуму:
Tulosba
06.03.2014, 21:59     Область видимости и указатели
  #16

Не по теме:

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

Yandex
Объявления
06.03.2014, 21:59     Область видимости и указатели
Ответ Создать тему
Опции темы

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