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

Указатели в качестве массивов, переменных и указетелей. - C++

Восстановить пароль Регистрация
 
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
20.09.2011, 21:04     Указатели в качестве массивов, переменных и указетелей. #1
Здравствуйте. Указатели опять начали заводить меня в тупик. Сначали расскажу о том что я понял после прочтение некоторой литературы:
1) Указатели содержут адрес переменной. Переменная изменяется при помощи *. Адрес переменой &. В общем пока всё довольно-таки просто и понятно.
2) Имя массива - адрес первого элемента массива, то есть константный указатель со знаком * перед именем. ОК. Так, теперь приведу код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>
#include <conio.h>
 
main ()
{
   int *b[5];
   int *c;
 
   *b[3] = 1000;
 
   *c = 2000;
 
   cout << "*b[3] = " << *b[3] << endl << "*c = " << *c;
 
   cout << endl << endl;
 
   getch();
 
   return 0;
}
--------------
Ответ:
*b[3] = 1000
*c = 2000
--------------
Возникает ненавязчивый вопрос: какого лысого? Какого *с содержит значение? Он же не указывает на переменную! А следовательно на значение *с память не выделяется. Или выделяется? Мда... Указатель как массив - тоже работает прекрасно, но как и ожидалось, не понятно. Хотя если объясните пример про переменную, про массив всё сразу станет ясно (надеюсь).

Спасибо! Жду ответов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.09.2011, 21:11     Указатели в качестве массивов, переменных и указетелей. #2
Цитата Сообщение от dimcoder Посмотреть сообщение
А следовательно на значение *с память не выделяется.
под b память тоже не выделялась

Цитата Сообщение от dimcoder Посмотреть сообщение
какого лысого? Какого *с содержит значение? Он же не указывает на переменную!
вы записали("испортили") в чужую ячейку
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.09.2011, 21:12     Указатели в качестве массивов, переменных и указетелей. #3
dimcoder, int *c не инициализирован, и его значением может быть любой мусор. Скажем, случилось так, что его значением стало 0x3f4221a9 (подставьте сюда ваше любимое число). И вот по этому адресу, 0x3f4221a9, и записалось значение 2000. Очень может быть, что оно затёрло что-то важное. Вам повезло (или нет?), что этот кусок памяти был вам доступен. Иначе была бы ошибка сегментации памяти. Всегда инициализируйте свои переменные.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.09.2011, 10:59     Указатели в качестве массивов, переменных и указетелей. #4
Цитата Сообщение от dimcoder
1) Указатели содержут адрес переменной. Переменная изменяется при помощи *. Адрес переменой &. В общем пока всё довольно-таки просто и понятно.
указателем можно назвать адрес
указателем можно назвать переменную-указатель
переменная-указатель - переменная, которой можно присвоить адрес
адрес - это число

есть две операции: & и *
первая получает адрес переменной (к функции тоже можно применять)
вторая получает доступ к данным, переходя по адресу к области, где эти данные хранятся

Цитата Сообщение от dimcoder
C++
1
int *c;
здесь нет второй операции
звёздочка - это просто часть объявления

Цитата Сообщение от dimcoder
C++
1
*c = 2000;
здесь есть вторая операция
операция * применяется к переменной-указателю c
она берёт данные из этой переменной, которые являются адресом (числом)
переходит по этому адресу к области, имеющей этот адрес
так как это левый операнд операции присваивания, то она заменяет выражение *c на область памяти, в которую можно записать
записывает в эту область 2000

Добавлено через 8 минут
Цитата Сообщение от dimcoder
2) Имя массива - адрес первого элемента массива, то есть константный указатель со знаком * перед именем.
имя массива преобразуется в адрес (число)
по этому адресу можно перейти к области, в которой хранятся данные первого элемента массива

Цитата Сообщение от dimcoder
C++
1
int *b[5];
это объявление массива указателей
в этот массив можно сохранить пять адресов
это пять переменных-указателей, объединённых в один массив
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
21.09.2011, 11:08     Указатели в качестве массивов, переменных и указетелей. #5
С указателями можно идеологически разбираться так:
память - это БОЛЬШОЙ массив; индекс элемента в этом массиве - и есть адрес.
Указатель - это переменная, которая хранит адрес (индекс элемента в массиве памяти).
Эта переменная должна быть проинициализирована (присвоено ей значение).
Либо с использованием операции &, либо с использованием операции new().
Типы переменной - указателя нужны только для повышения надежности, чтобы ХОТЬ КАКАЯ_ТО ЗАЩИТА от непреднамеренных ошибок присвоения была.
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
21.09.2011, 12:43  [ТС]     Указатели в качестве массивов, переменных и указетелей. #6
Ну теперь всё понятно. Я то уж думал, что это "особенности языка", а оказывается рандомный выбор области в пямяти для указателя. Хотя не знаю, реально ли он рэндомный изза "особенностей языка".
Спасибо всем!
Trif
0 / 0 / 0
Регистрация: 27.09.2011
Сообщений: 3
28.09.2011, 00:21     Указатели в качестве массивов, переменных и указетелей. #7
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
#include <iostream>
using namespace std;
 
int *f1(int* pA, int* pB);
void f2(int* pCC);
 
void main()
{
    int a = 2, b = 3;
    int *pA = &a;
    int *pB = &b;
    int *pCC;
    pCC = f1(pA, pB);
    cout << *pCC << "\n";   
    f2(pCC);
 
}
 
int *f1(int* pA, int*pB)
{
    int c;
    c = *pA + *pB;
    int *pC = &c;
    return pC;
}
 
void f2(int* pCC)
{   
    cout << *pCC << "\n";
}
Почему f1 возвращает адрес и при разыменовании указателя выводит на экран "5", а при вызове f2 и передаче в качестве параметра ранее полученного адреса - выводит "-858993460" ?
То есть адрес один и тот же, а при разыменовании выводит разные значения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2011, 00:28     Указатели в качестве массивов, переменных и указетелей.
Еще ссылки по теме:

Указатели (нужно передать массив в качестве параметра в функцию) C++
Использование массивов в качестве аргумента функции C++
Передача функции с двумерным массивов в качестве параметра C++

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
28.09.2011, 00:28     Указатели в качестве массивов, переменных и указетелей. #8
Trif, а если так?

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
33
#include <iostream>
using namespace std;
 
int *f1(int* pA, int* pB);
void f2(int* pCC);
 
int main()
{
        int a = 2, b = 3;
        int *pA = &a;
        int *pB = &b;
        int *pCC;
 
        pCC = f1(pA, pB);
        cout << *pCC << "\n";
 
        f2( pCC );
 
        cout << *pCC << "\n"; // тут тоже выводит мусор
}
 
int *f1(int* pA, int*pB)
{
        int c;
        c = *pA + *pB;
        int *pC = &c;
        return pC;
}
 
void f2(int* pCC)
{
        cout << *pCC << "\n";
}
А всё потому, то возвращается адрес локальной переменной int c. Она создаётся в f1, при выходе из неё - удаляется. Какое-то время тот участок памяти, который она занимала, остаётся неизменным, и вам удаётся вывести его значение, а затем что-то его занимает и переписывает. И по тому же адресу хранятся уже чьи-то чужие данные.
Yandex
Объявления
28.09.2011, 00:28     Указатели в качестве массивов, переменных и указетелей.
Ответ Создать тему
Опции темы

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