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

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

Войти
Регистрация
Восстановить пароль
 
 
dr.curse
388 / 344 / 16
Регистрация: 11.10.2010
Сообщений: 1,907
#1

Указатели - в чем суть? - C++

22.11.2010, 17:24. Просмотров 22237. Ответов 39
Метки нет (Все метки)

Кто нибидь может мне обястнить укасзатели в С++,ато я некак не врубаюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.11.2010, 17:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели - в чем суть? (C++):

В чем суть этого задание? - C++
#include <iostream> #include <string> #include <math.h> /* run this program using the console pauser or add your own getch,...

ovefrlow? ошибка в чем суть - C++
#include <iostream> using std::cout; unsigned long long quad(long long num) { long long val = 0; if(num==0) return 1; ...

Циклы while и for: в чем суть отличия? - C++
Пытаюсь понять в чем суть отличия между этими циклами. Пишутся по разному, а по сути тоже самое. Можно ли написать цикл while таким...

Не могу разобраться в чем суть ошибки - C++
Даны действительные числа x, y. Если они отрицательны, то каждое значение заменить модулем; если отрицательно только одно из них, то оба...

Поразрядные операции - в чем суть и применение? - C++
Давно откладывал эту тему, но все же столкнулся с ней снова. Так вот, не могу понять зачем они, где и как их использовать?

Алгоритмы поиска. Подскажите, в чем суть алгоритма? - C++
нужно написать алгоритм поиска прямым методом (С.Чарас), а я понятия не имею, что это за метод и в и-нэте найти не могу(

39
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.11.2013, 13:53 #16
Цитата Сообщение от me4ta Посмотреть сообщение
Подскажите, можно ли сравнивать значения указателей?
Можно сравнить и значения двух указателей, и значения данных, на которые они указывают, то есть чьи адреса хранят. Можно даже сравнить значение указателя со значением данного, чей адрес хранит указатель большей кратности.

Добавлено через 31 секунду
Цитата Сообщение от ПерС Посмотреть сообщение
перегрузка функций;
Функции отлично перегружаются без указателей.

Добавлено через 37 секунд
Цитата Сообщение от ПерС Посмотреть сообщение
любое ООП.
ООП отлично пишется без указателей.

Добавлено через 2 минуты
Цитата Сообщение от ПерС Посмотреть сообщение
проще сказать, где не используются указатели, особенно при системном программировании
Для решения простейших задач и подзадач, не требующих изменения функцией её параметров, при условии, что количество данных задачи/подзадачи точно известно на этапе компиляции и ни одно из этих данных не является элементом массива.

Добавлено через 3 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
Ещё это может быть тензор
Третьего ранга. Матрица же есть тензор второго ранга.
0
ПерС
371 / 287 / 89
Регистрация: 05.11.2013
Сообщений: 820
Записей в блоге: 5
Завершенные тесты: 1
18.11.2013, 14:09 #17
Цитата Сообщение от taras atavin Посмотреть сообщение
Массив матриц это может означать, но ни как не отдельную матрицу
Выполнил пример в 2 средах.
убрал только устаревшее ожидание клавиши bioskey()
Он формирует и выводит на экран матрицу, элементами которой являются строки переменной длины.
Судя по коду, ничего другого он и не мог бы сделать.
Ошибок в коде не вижу.
скрин прогона проги:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 Enter string for a[0,1]:2222
 
 Enter string for a[0,2]:3 3 3 3 3 3 3 3
 
 Enter string for a[1,0]:4 4 4 4
 
 Enter string for a[1,1]:555
 
 Enter string for a[1,2]:666
 
 Enter string for a[2,0]:7 7 7
 
 Enter string for a[2,1]:8
 
 Enter string for a[2,2]:9999
 
 String matrix:
111 111 111     2222    3 3 3 3 3 3 3 3
4 4 4 4 555     666
7 7 7   8       9999
 Press any key to continue
Если быть более точным, исходный subj здесь означает двумерную матрицу с элементами-указателями, откуда и третья "*"
C++
1
2
char **a; //матрица символов, 2-мерная
char ***a; //матрица указателей на char, 2-мерная
но
C++
1
2
int **a; //2-мерная матрица целых
int ***a; //3-мерная матрица целых
Добавлено через 6 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
не требующих изменения функцией её параметров
параметры функций можно менять без указателей. Ссылка & в заголовке
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.11.2013, 14:22 #18
Цитата Сообщение от ПерС Посмотреть сообщение
параметры функций можно менять без указателей. Ссылка & в заголовке
Параметр-ссылка надстраивается над указателем, переменный адрес в такую функцию надо передать в любом случае, а адрес - значение указателя. Это ссылки аля
C++
1
2
3
4
5
int main ()
{
 int i;
 int &j=i;
 ...
можно реализовать дубль-записью в таблице переменных компилятора, а параметр-ссылка должен в разное время быть синонимом разных данных, что реализуется только укзателем.

Добавлено через 2 минуты
Цитата Сообщение от ПерС Посмотреть сообщение
char ***a; //матрица указателей на char, 2-мерная
Нет. Матрица есть математический объект, состоящий из чисел, а не указателей на символы. И строго двумерный.

Добавлено через 2 минуты
А это плоский массив нуль-терминальных строк, но ни как не матрица. Массив даже двумерный - не синоним матрицы. Матрица должна ещё по определённым алгоритмам складываться с себе подобными, умножаться на них и на скаляр, а квадратная матрица должна ещё иметь детерминант.
1
ПерС
371 / 287 / 89
Регистрация: 05.11.2013
Сообщений: 820
Записей в блоге: 5
Завершенные тесты: 1
19.11.2013, 05:59 #19
Цитата Сообщение от taras atavin Посмотреть сообщение
А это плоский массив нуль-терминальных строк, но ни как не матрица
Ладно, Вас не переспоришь, +1 за дотошность
Определение "Таблица нуль-терминальных строк" Вас устроит?
И она здесь двумерна, т.к. положение каждой строки определяется двумя индексами.
Под матрицей я и имел в виду эту двумерность, а не матрицу как математический объект
0
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 401
19.11.2013, 08:11 #20
Ребят,а можно подробней про двойные указатели?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 08:59 #21
Двойной указатель есть указатель на указатель на не указатель. То есть это некое данное, значение которого - адрес другого данного, чьё значение - адрес третьего данного, но уже его значение адресом не является, или же это некое данное, значение которого - адрес другого данного, значение которого - адрес функции.

Добавлено через 46 минут
Например, двойной указатель на char есть данное, значение которого есть адрес другого данного, значение которого есть адрес, по которому лежит char.
0
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 401
19.11.2013, 10:37 #22
А пример функционала в коде ?
0
D_Ok
44 / 33 / 12
Регистрация: 11.02.2014
Сообщений: 134
11.02.2014, 18:24 #23
Помогите разобраться

C++
1
2
3
int *x = new int;
    *x = 1;
std::cout << x << "\t" << &x << std::endl;
*x - это получается переменная;
x - ее адрес;
а - &x это адрес чего? и под что выделяется эта область памяти? под сам указатель?
0
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,387
Завершенные тесты: 1
11.02.2014, 18:43 #24
Цитата Сообщение от D_Ok Посмотреть сообщение
&x это адрес чего?
Адрес той ячейки памяти, в которой хранится этот указатель.
Цитата Сообщение от D_Ok Посмотреть сообщение
int *x = new int;
Выделяет память для хранения указателя в стеке и для значения,
определяемого указателем, в куче.
0
D_Ok
44 / 33 / 12
Регистрация: 11.02.2014
Сообщений: 134
11.02.2014, 20:35 #25
Хмм окей, с этим понятно боле менее.
а так:
C++
1
2
3
4
int size, turn;
int *x = new int[size];
std::cin >> turn;
turn ? size = 10 : size = 0;
память под указатель будет выделятся в любом случае (ну если условий других нету), а вот если переменная или размер массива не инициализирован, то и память под него не будет выделятся, так? В этом примере например если переменная false, то и память под массив не выделится?
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
12.02.2014, 08:32 #26
Цитата Сообщение от D_Ok Посмотреть сообщение
если переменная или размер массива не инициализирован, то и память под него не будет выделятся, так?
Не так. Если переменная не инициализирована, то в ней находится мусор. Переменная это просто кусок памяти - при объявлении переменной он выделился, а что в нем находилось одному богу известно.
Может даже случиться, что произойдет попытка создать массив отрицательного размера.
Цитата Сообщение от D_Ok Посмотреть сообщение
если переменная false, то и память под массив не выделится?
Все выделится. Потому как выделение памяти происходит раньше, чем проверка условия (если вы говоря false имели в виду переменную turn). А в последней строке произойдет просто потеря размера динамического массива, что чревато либо утечкой памяти, если size станет меньше, чем был, либо, если станет больше, выходом за границы, а следовательно попыткой обращения к чужой памяти.
1
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2014, 08:36 #27
Добавлено через 1 минуту
Цитата Сообщение от D_Ok Посмотреть сообщение
В этом примере например если переменная false,
В этом примере вообще нет логических переменных.
0
DrOffset
7316 / 4416 / 1000
Регистрация: 30.01.2014
Сообщений: 7,253
12.02.2014, 08:53 #28
Цитата Сообщение от taras atavin Посмотреть сообщение
В этом примере вообще нет логических переменных.
В условии тернарного оператора int неявно приводится к bool. Строго говоря, тут есть rvalue типа bool.
Логических именно переменных - нет.
Но, если уж поправлять, то полностью
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.02.2014, 11:29 #29
Цитата Сообщение от D_Ok Посмотреть сообщение
*x - это получается переменная;
x - ее адрес;
а - &x это адрес чего? и под что выделяется эта область памяти? под сам указатель?
У тебя есть две переменные: автоматическая, и динамическая. Динамическая хранит обычное целое, а автоматическая особая, она хранит значение указателя, которое есть адрес другого данного. Получается, что одна переменная хранит адрес другой. Но сама то она тоже хранится по какому то адресу. Так вот, x - автоматическая переменная указательного типа, то есть просто указатель, её значение - адрес обычного данного, *x - это уже динамическая переменная, хранящая обычное целое, а &x - адрес указателя.

Добавлено через 28 секунд
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Может даже случиться, что произойдет попытка создать массив отрицательного размера.
Не может, size_t беззнаковый.
1
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,530
Завершенные тесты: 1
12.02.2014, 11:38 #30
Цитата Сообщение от taras atavin Посмотреть сообщение
Не может, size_t беззнаковый.
И что?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2014, 11:38
Привет! Вот еще темы с ответами:

Как работает программа? В чем суть функции fgets? - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; int main(int argc, char** argv) //кол-во аргументов, указатель на массив указателей на сами...

Объясните, в чем суть директив #ifndef/#define/#endif - C++
Не понял в чем суть директив: #ifndef .. #define.. #endifОбъясните пожалуйста..это как - то связано с хедерами, но вот как ??

Как в int* var хранить массивы? В чем суть задания? - C++
Всем добрый день :). В задании говорится: &quot;Создайте класс контейнера для целых чисел&quot;. Далее приводится сам класс: private: int...

простыми словами объяснте пожалуйста, в чем суть этого оператора: -> - C++
простыми словами объяснте пожалуйста, в чем суть этого оператора: -&gt;


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
12.02.2014, 11:38
Ответ Создать тему
Опции темы

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