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

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

Войти
Регистрация
Восстановить пароль
 
 
extremist38
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
#1

Указатели. Не понимаю - C++

19.12.2012, 03:27. Просмотров 628. Ответов 18
Метки нет (Все метки)

Разбираю указатели, слегка запнулся на одном месте.

У меня есть функция:
C++
1
2
3
4
void Dit(int &x)
{
    x *= 2;
}
Использую я в программе это так:
C++
1
Dit(x);
И я не могу понять, почему это работает.
Судя по книжке, которую я читаю, & - взятие адреса. То есть получается, я передаю в функцию адрес. А внутри её использую как обычную переменную. При попытке написать что-то в стиле "*x *= 2;" компилятор пишет, что неверно. Почему так?

Добавлено через 20 минут
Также есть небольшая ситуация.
Возможно использования массивов через указатели, то есть.

C++
1
2
3
int *p;
int arr[100500];
p = &arr;
При этом, если делать p++, то говорится, что р будет указывать на следующий элемент в массиве. Но ведь элементы массива в оперативной памяти разбросаны по участкам и не обязательно идут друг за дружкой (особенно если массив весит очень много). Насколько я знаю, p++ к указателю даёт результат следующей ячейки в памяти. И у меня возникает вопрос: кто следит за тем, чтобы p указывал именно на следующий элемент в массиве, а не в памяти? И гарантированно ли он будет указывать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2012, 03:27     Указатели. Не понимаю
Посмотрите здесь:

не совсем понимаю код *указатели - C++
изучаю указатели, столкнулся с кодом не совсем могу понять что происходит в функции *g_s, особенно это условие *p2 && *p2 == *p ...

С++ не понимаю - C++
1. сумму элементов массива с нечетными номерами; 2. сумму элементов массива, расположенных между первым и последним отрицательными...

Не Понимаю С++ - C++
есть какие нибудь проги которые обясняют как раскладывать задачку(пример) написания в С++

Не понимаю ошибку - C++
#include <stdio.h> #include <math.h> #include <conio.h> int main() { int n,i; float a; printf ("\n a="); scanf ...

не понимаю ошибку - C++
Написать программу, решающую задачу линейного поиска элемента в заданном вещественном массиве. _____ при вводе единицы выводит 0, ...

Не понимаю записи - C++
Немогу понят что к чему const Vector2D& Vector2D::Zero() { static Vector2D zero(0.0f, 0.0f); return zero; } Наиболее...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
icecreeam
3 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 13
19.12.2012, 03:35     Указатели. Не понимаю #2
Цитата Сообщение от extremist38 Посмотреть сообщение
И я не могу понять, почему это работает.
Судя по книжке, которую я читаю, & - взятие адреса. То есть получается, я передаю в функцию адрес. А внутри её использую как обычную переменную. При попытке написать что-то в стиле "*x *= 2;" компилятор пишет, что неверно. Почему так?
на сколько я знаю, знак амперсанда используется не только для взятия адреса, а и для работы с ссылочными типами данных.

По поводу массивов мне кажется что его элементы не разбросаны и идут друг за другом.
extremist38
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
19.12.2012, 03:46  [ТС]     Указатели. Не понимаю #3
Цитата Сообщение от icecreeam Посмотреть сообщение
на сколько я знаю, знак амперсанда используется не только для взятия адреса, а и для работы с ссылочными типами данных.
Тогда что означает то, что я написал?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.12.2012, 03:48     Указатели. Не понимаю #4
Цитата Сообщение от extremist38 Посмотреть сообщение
void Dit(int &x)
Функция, принимающая целочисленный аргумент по ссылке.

Добавлено через 41 секунду
Цитата Сообщение от extremist38 Посмотреть сообщение
p = &arr;
Взятие адреса указателя на нулевой элемент массива.
extremist38
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
19.12.2012, 03:51  [ТС]     Указатели. Не понимаю #5
Цитата Сообщение от 0x10 Посмотреть сообщение
Функция, принимающая целочисленный аргумент по ссылке.
То есть получается, что я не ссылку принимаю? Или всё же ссылку?
icecreeam
3 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 13
19.12.2012, 03:54     Указатели. Не понимаю #6
C++
1
void Dit(int &x)
в этом случае вы передаете значение по ссылке
C++
1
Dit(x)
при вызове

C++
1
void Dit(int *x)
а в этом вы передаете адрес значения
C++
1
Dit(&x)
при вызове

описал на сколько я себе это представляю.
extremist38
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
19.12.2012, 04:09  [ТС]     Указатели. Не понимаю #7
Кликните здесь для просмотра всего текста
Цитата Сообщение от icecreeam Посмотреть сообщение
C++
1
void Dit(int &x)
в этом случае вы передаете значение по ссылке
C++
1
Dit(x)
при вызове

C++
1
void Dit(int *x)
а в этом вы передаете адрес значения
C++
1
Dit(&x)
при вызове

описал на сколько я себе это представляю.

Я прекрасно понимаю, как работает второй вариант. Только с первым непонятки. Если я передаю значение, почему тогда переменная изменяется? Или я передаю значение вместе с ссылкой? (то есть саму переменную??...)

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Функция, принимающая целочисленный аргумент по ссылке.

Добавлено через 41 секунду

Взятие адреса указателя на нулевой элемент массива.
Всё же, всегда ли элементы массива идут друг за дружкой? Что происходит, если невозможно выделить массив одним куском?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.12.2012, 04:14     Указатели. Не понимаю #8
Цитата Сообщение от extremist38 Посмотреть сообщение
Я прекрасно понимаю, как работает второй вариант. Только с первым непонятки. Если я передаю значение, почему тогда переменная изменяется? Или я передаю значение вместе с ссылкой? (то есть саму переменную??...)
Создается ссылка, которая инициализируется объектом.

Цитата Сообщение от extremist38 Посмотреть сообщение
Всё же, всегда ли элементы массива идут друг за дружкой?
А как иначе-то?

Цитата Сообщение от extremist38 Посмотреть сообщение
Что происходит, если невозможно выделить массив одним куском?
Предполагаю, что происходит пичалька. (объяснил, да? =) )
extremist38
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
19.12.2012, 04:17  [ТС]     Указатели. Не понимаю #9
Цитата Сообщение от 0x10 Посмотреть сообщение
Предполагаю, что происходит пичалька. (объяснил, да? =) )
Понятно, что примерно выходит )
Следующий вопрос будет: как можно предусмотреть такую ситуацию и предотвратить печальку? )
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.12.2012, 04:22     Указатели. Не понимаю #10
Цитата Сообщение от extremist38 Посмотреть сообщение
Всё же, всегда ли элементы массива идут друг за дружкой? Что происходит, если невозможно выделить массив одним куском?
1. Всегда.

2. Память не выделяется. А дальше в зависимости от настроек и т. п. возможны три варианта:
a) есть вариант new с дополнительным аргументом, который заставит new просто вернуть NULL;
б) по умолчанию new выбрасывает исключение std::bad_alloc;
в) с помощью set_new_handler() можно установить функцию-обработчик на этот случай, которая должна или повыбрасывать всякий мусор, чтобы new попробовала выделить память ещё раз, или выбросить std::bad_alloc или прибить программу, если она облажалась с высвобождением.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
19.12.2012, 07:25     Указатели. Не понимаю #11
Цитата Сообщение от extremist38 Посмотреть сообщение
int *p;
int arr[100500];
p = &arr;
ошибка будет
вот такая
1> error C2440: =: невозможно преобразовать 'int (*)[100500]' в 'int *'
все дело в том что arr уже имеет тип int * (указатель)
нет в С массивов как например в Фортране
есть указатель на область памяти где лежит массив
а этим
C++
1
p = &arr
ты берешь указатель на указатель
значит надо писать так если тебе нужна копия указателя
C++
1
2
3
int *p;
int arr[100500];
p = arr;
или так
C++
1
2
3
int *p;
int arr[100500];
p = &arr[0];
что означает взять указатель на первый(нулевой) элемент массива arr
и это равнозначно p = arr
OhMyGodSoLong
19.12.2012, 09:16
  #12

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
нет в С массивов как например в Фортране
Но схитрить можно:
struct array { int data[100500]; };
Такая штука позволяет передавать массивы по значению.

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.12.2012, 09:55     Указатели. Не понимаю #13
extremist38, указатель есть данное, хранящее адрес подпрограммы, или другого данного. Кратный указатель есть данное, хранящее адрес другого указателя. Указатель, хранящий адрес указателя, хранящего адрес не указателя, называется двойным указателем, указатель, хранящий адрес указателя, хранящего адрес указателя, хранящего адрес указателя, называется тройным указателем и так далее. Сколько указателей нужно использовать, чтоб добраться до не указателя, такова и кратность указателя. Адрес есть значение самого указателя. Адрес есть номер байта в памяти, с которого начинается то, чей это адрес. Например, адрес переменной есть номер байта в памяти, с которого начинается эта переменная. Ссылка есть синоним другой переменной. Можно считать, что ссылка ведёт себя, как неявно разыменуемый при каждом обращении к нему указатель. Но стандарт не гарантирует реализацию ссылок через указатели, вместо этого ссылка может быть реализована дублированием адреса в таблице переменных компилятора, а в готовом коде будет прямая адресация, то есть доступ по адресу в коде программы, а не в данном. Исключение - передаваемые по ссылкам параметры неинлайновых функций и передаваемые по ссылкам операнды неинлайновых перегруженных операторов, в этом случае альтернативные реализации не возможны и ссылка становится синтаксической надстройкой над указателем. Разыменование указателя есть операция доступа не к самому указателю, а к тому, чей адрес он хранит, на низком уровне разыменованию соответствует операция косвенной адресации.

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
нет в С массивов как например в Фортране
C
1
char s[16];
- массив.

Добавлено через 1 минуту
Цитата Сообщение от extremist38 Посмотреть сообщение
& - взятие адреса.
Нет. У тебя этот оператор стоит в декларации, а в этом случае & означает, что следующий идентификатор есть имя ссылки.

Добавлено через 3 минуты
Цитата Сообщение от extremist38 Посмотреть сообщение
Но ведь элементы массива в оперативной памяти разбросаны по участкам и не обязательно идут друг за дружкой
Они не разбрасываются, классический массив - это единый блок, не путай его с массивами-объектами, которые могут быть реализованы на чём угодно, включая списки. Но тогда каждый элемент будет хранить адрес следующего, а оператор ++ для указателя перегружается на копирование адреса следующего элемента из текущего.

Добавлено через 4 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
нет в С массивов как например в Фортране
есть указатель на область памяти где лежит массив
Массивы в c/c++ есть, просто они реализованы на указателях. Но
C++
1
2
3
4
5
6
7
int a[1000];
int *p=a;
std::cout<<sizeof(a); // выведет размер тысячи интов, а не указателя
std::cout<<std::endl;
std::cout<<sizeof(p);// выведет размер самого указателя
std::cout<<std::endl;
std::cout<<sizeof(a[0]);// выведет размер нулевого элемента
, в то же время
C++
1
2
int a[1000];
int *p=a; // здесь a - указатель и присвоено будет значение указателя указателю же
.
extremist38
0 / 0 / 0
Регистрация: 19.12.2012
Сообщений: 6
19.12.2012, 10:30  [ТС]     Указатели. Не понимаю #14
Цитата Сообщение от taras atavin Посмотреть сообщение
Но стандарт не гарантирует реализацию ссылок через указатели, вместо этого ссылка может быть реализована дублированием адреса в таблице переменных компилятора, а в готовом коде будет прямая адресация, то есть доступ по адресу в коде программы, а не в данном. Исключение - передаваемые по ссылкам параметры неинлайновых функций и передаваемые по ссылкам операнды неинлайновых перегруженных операторов, в этом случае альтернативные реализации не возможны и ссылка становится синтаксической надстройкой над указателем. Разыменование указателя есть операция доступа не к самому указателю, а к тому, чей адрес он хранит, на низком уровне разыменованию соответствует операция косвенной адресации.
Спасибо за объяснение. Тогда такой вопрос:
Будет ли реализация через ссылку
C++
1
2
3
4
void Dit(int &x)
{
    x *= 2;
}
являться грамотно написанной и работающей? Или это всё же лучше делать через указатели?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2012, 10:32     Указатели. Не понимаю
Еще ссылки по теме:

isdigit() не понимаю - C++
Здрасти всем! Не могу понять, почему isdigit() неверно себя ведет. Точнее абсолютно наоборот. #include &lt;iostream&gt; const int...

Не понимаю программу на С++ - C++
Здравствуйте, есть такой код: #include&lt;iostream&gt; #include &lt;cstdio&gt; using namespace std; int main () { int i; char s; ...

Не понимаю вызовы - C++
Абсолютно не понимаю вызовы. Учусь по книге Страуструпа. ... void print_square(int v); { cout&lt;&lt;v&lt;&lt;'\t'&lt;&lt;v*v&lt;&lt;endl; } int...

не понимаю условие!! - C++
Добрый день!!! Я взялся за самостоятельное изучение С++. Мой опыт составляет два дня)) Все что я изучил(пока) - линейные программы. Задачки...

Не понимаю формулу =) - C++
Знаю как это сделать но не магу понять как написать эту формулу ((( хелп плз Написать функцию вычисления многочлена вида ...


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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
13057 / 7320 / 817
Регистрация: 27.09.2012
Сообщений: 18,066
Записей в блоге: 3
Завершенные тесты: 1
19.12.2012, 10:32     Указатели. Не понимаю #15
Цитата Сообщение от extremist38 Посмотреть сообщение
являться правильно написанной и гарантированно работающей? Или это всё же лучше делать через указатели?
Для этого их и придумали - чтобы не возится с указателями, как в Си, да и код выглядит понятнее
Yandex
Объявления
19.12.2012, 10:32     Указатели. Не понимаю
Ответ Создать тему
Опции темы

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