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

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

Войти
Регистрация
Восстановить пароль
 
ToLexx
2 / 2 / 0
Регистрация: 21.10.2013
Сообщений: 174
#1

Пояснить по работе с указателями - C++

30.06.2015, 16:22. Просмотров 236. Ответов 4
Метки нет (Все метки)

Здравствуйте!
волнует вопрос об указателях:
1) указатель на переменную используется для ускорения выполнения программы, заменяя реальное значение переменной, указателем на адрес первого байта.
C++
1
2
int a = 10;
int *b = &a;  // указателю *b присвоили адрес переменной
При выводе получим:
a=10;
b=адрес а;
&a=адрес a;
*b=10;

2) указатель на массив строк или же массив указателей на строки?!
C++
1
int *a[]
3) Указатель на указатель на переменную (хоть убейте не понимаю для чего оно надо, если уже есть указатели уменьшающие объём обрабатываемых данных):
C++
1
 int **a;
будет содержать адрес переменной, содержащей адрес переменной а.

4) указатель на массив указателей:
C++
1
int **a[10]
В данном случае есть указатель на массив адресов, указывающих на адреса первого элемента строки

5) указатель на функцию((
вот тут я плыву реально.
C++
1
2
3
4
5
6
7
int ** Create( size_t n, size_t m ) {    создаём указатель на указатель на функцию, к чему это?!
int ** M = new int * [n];                   создание указателя на массив указателей на переменные
for ( size_t i = 0; i < n; ++i ) {
     M[i] = new int [m];
    }
    return M;
}
Данный кусок взят из Образцы (шаблоны) программ для типовых задач
Общий смысл самого примера понял, а вот функции не особо.
чем отличается ссылка на функцию и просто функция?!
Или же предполагается, что в функции будут обрабатывается огромные объёмы и поэтому мы даём её адрес?

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

Как избавиться от * и . при работе с указателями? - C++
Сразу приведу пример: #include &lt;stdio.h&gt; struct struct5 { int* value; }; struct struct4 { struct5* s5; };

Что не так при работе с указателями? - C++
Здравствуйте! Начинаю изучать работу с указателями. #include &lt;iostream&gt; using namespace std; int fun(int a, int b, long...

Помогите найти ошибку в коде при работе с указателями - C++
Блин, я когда нибудь пойму эти указатели!!???? Подскажите где ошибся? #include&lt;iostream&gt; using namespace std; int foo(int&amp;num); ...

Исправить ошибку компиляции C2371 при работе с указателями - C++
Привет :) Проходу тему &quot;Указатели&quot;, написал программу. Компилятор ругается, не знаю почему. Сделал всё так как написано в примере....

MSVS ошибка setlocale при работе с указателями на массивы - C++
Ниже код, пытаюсь нарисовать умножение матриц. До самого умножения еще не дошел, пока только на заполнении матриц и вывод их на экран....

При работе с указателями на сервер отправляется мусор, но выводит в консоль норм данные - C++
День добрый! Отправляю на сервер разные штуки и на снифер это ловлю, вот что получается: char buf = &quot;AAABBB&quot;; на снифере AAABBB -...

4
zss
Модератор
Эксперт С++
6474 / 6037 / 1980
Регистрация: 18.12.2011
Сообщений: 15,631
Завершенные тесты: 1
30.06.2015, 16:56 #2
M = new int * [n]; - выделяется память под массив указателей.
Адрес этой памяти записывается в переменную M.
Поскольку она объявлена локально, то ее значение надо как-то передать в вызывающую программу.
Одно из решений возвратить как результат функции.
Вызывающая программа это число должна запомнить
C++
1
int** x=Create(N,M);
Второй способ - из вызывающей программы указать место, куда записать этот адрес
C++
1
2
3
4
5
6
7
8
9
void Create(int** &M, size_t n, size_t m ) // Передаем M по ссылке, т.е. M хранит реальный адрес, а не копию
{ 
   M = new int*[n];   // записываем непосредственно по адресу из вызывающей программы
   for ( size_t i = 0; i < n; ++i ) 
       M[i] = new int [m];
}
...
int** x;
Create(x,N,M);
1
smartpointer
67 / 61 / 23
Регистрация: 17.02.2014
Сообщений: 256
30.06.2015, 17:16 #3
Цитата Сообщение от ToLexx Посмотреть сообщение
может ли указатель указывать ещё на что-то кроме как в пунктах выше??
Есть еще указатели на данные структуры.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
struct Foo
{
    int x;
    int y;
}foo;
 
int Foo::*ptr;
 
int main()
{
    ptr = &Foo::x;
    foo.x = 0;
    std::cout<<"Foo x:"<<foo.x<<std::endl;
    foo.*ptr = 15;
    std::cout<<"Foo x:"<<foo.x<<std::endl;
    return 0;
}
1
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,812
30.06.2015, 18:14 #4
Цитата Сообщение от ToLexx Посмотреть сообщение
1) указатель на переменную используется для ускорения выполнения программы, заменяя реальное значение переменной, указателем на адрес первого байта.
Ускорение там даже не нулевое, а отрицательное - вместо прямого доступа к переменной, надо подглядывать в указатель где она лежит. Указатель нужен тогда, когда вам нужно запомнить "нужная переменная лежит вон там". Ну или когда вы не знаете заранее точный тип/размер переменной (куча наследников базового класса) и вынуждены пихать ее в динамическую память.
Цитата Сообщение от ToLexx Посмотреть сообщение
чем отличается ссылка на функцию и просто функция?!
Тем, что ссылку можно поменять на стадии исполнения программы. А вот с кодом функции такой фокус не пройдет. Ну, то есть, в некоторых языках пройдет, но C++ к ним не относится.
1
rjxk
7 / 7 / 6
Регистрация: 18.06.2015
Сообщений: 30
30.06.2015, 18:47 #5
Цитата Сообщение от ToLexx Посмотреть сообщение
int ** Create( size_t n, size_t m ) { * *создаём указатель на указатель на функцию
создаём функцию
0
30.06.2015, 18:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2015, 18:47
Привет! Вот еще темы с ответами:

Как лучше копировать память, обмениваться указателями и т.д. при работе с кучей динамических библиотек (DLL) ? - C++
Привет! Вот есть много DLL-к, каждая работает со своей внутренней динамической памятью, а так же есть необходимость работать с объектами...

Пояснить строку - C++
Программисты! Объясните пожалуйста эту строку, только подробно желательно. if (Key ==DecimalSeparator) ...

Пояснить конструктор - C++
Вот такая вешчь в конструкторе, а что она означает и как работает? TClass::TClass(float x) { TClass::x=x; }

Пояснить работу цикла - C++
Привет всем Ребята помогите расскажите мне как работает этот Код точнее команда for в нете инфы много ну ни как не могу понять #include...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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