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

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

Восстановить пароль Регистрация
 
ToLexx
1 / 1 / 0
Регистрация: 21.10.2013
Сообщений: 139
30.06.2015, 16:22     Пояснить по работе с указателями #1
Здравствуйте!
волнует вопрос об указателях:
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;
}
Данный кусок взят из Образцы (шаблоны) программ для типовых задач
Общий смысл самого примера понял, а вот функции не особо.
чем отличается ссылка на функцию и просто функция?!
Или же предполагается, что в функции будут обрабатывается огромные объёмы и поэтому мы даём её адрес?

может ли указатель указывать ещё на что-то кроме как в пунктах выше??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 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);
smartpointer
 Аватар для smartpointer
64 / 58 / 23
Регистрация: 17.02.2014
Сообщений: 250
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;
}
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
30.06.2015, 18:14     Пояснить по работе с указателями #4
Цитата Сообщение от ToLexx Посмотреть сообщение
1) указатель на переменную используется для ускорения выполнения программы, заменяя реальное значение переменной, указателем на адрес первого байта.
Ускорение там даже не нулевое, а отрицательное - вместо прямого доступа к переменной, надо подглядывать в указатель где она лежит. Указатель нужен тогда, когда вам нужно запомнить "нужная переменная лежит вон там". Ну или когда вы не знаете заранее точный тип/размер переменной (куча наследников базового класса) и вынуждены пихать ее в динамическую память.
Цитата Сообщение от ToLexx Посмотреть сообщение
чем отличается ссылка на функцию и просто функция?!
Тем, что ссылку можно поменять на стадии исполнения программы. А вот с кодом функции такой фокус не пройдет. Ну, то есть, в некоторых языках пройдет, но C++ к ним не относится.
rjxk
 Аватар для rjxk
7 / 7 / 6
Регистрация: 18.06.2015
Сообщений: 30
30.06.2015, 18:47     Пояснить по работе с указателями #5
Цитата Сообщение от ToLexx Посмотреть сообщение
int ** Create( size_t n, size_t m ) { * *создаём указатель на указатель на функцию
создаём функцию
Yandex
Объявления
30.06.2015, 18:47     Пояснить по работе с указателями
Ответ Создать тему
Опции темы

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