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

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

Войти
Регистрация
Восстановить пароль
 
 
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

Вопрос про указатели на массивы - C++

11.03.2010, 14:20. Просмотров 721. Ответов 16
Метки нет (Все метки)

В книге написано
C++
1
2
3
4
int a[5];
int *p;
p = &a; //У меня выдает ошибку
p = &a[0]; //Так работает
p = ПОЛУЧИТЬ_адрес_объекта - Это же только применимо к переменным. а когда указатеь на массив надо писать без & (мля опять забыл почему( )

Хотя второй вариант работает.
p = &(a+0)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2010, 14:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про указатели на массивы (C++):

Вопрос про указатели - C++
char *a = "s"; 1. Выделяется место в памяти 2. В это место записывается s 3. Указателю a приваивают адрес памяти где храниться s ...

Вопрос про указатели - C++
#include <iostream.h> int main() { int x; int *Pointer; pointer = &x; cout << pointer; cout << *ponter; return 0; ...

Про массивы и указатели - C++
#include <iostream> using namespace std; int Digit = { {1,8,6,7},{3,2,9,4},{5,1,2,7},{8,6,2,5} }, test; int main() { ...

Вопрос по программе на тему: Массивы и указатели. Динамическое выделение памяти - C++
народ, очень прошу! пожалуйста! Помогите решить задачку на тему: Массивы и указатели. Динамическое выделение памяти Вот задача. ...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

16
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
11.03.2010, 14:25 #2
так как
Цитата Сообщение от Krist_ALL Посмотреть сообщение
p = &a
p присваивается адрес указателя на массив целых чисел... ошибка потому , чтоб её не было надо сделать так int **p
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.03.2010, 14:32  [ТС] #3
Имя массива - указатель на память.

int a[5];
int *p;
p = a; //Присвоили адрес т.к a хранит адрес на память где храняться числа.
p = &a; //Адрес из адреса???
0
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
11.03.2010, 14:41 #4
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.03.2010, 14:45  [ТС] #5
Цитата Сообщение от User1990 Посмотреть сообщение
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива
Допустим, но что тогда значит
C++
1
2
3
int a[5];
int *p;
p = a;
0
Alexandoros
228 / 66 / 4
Регистрация: 02.06.2009
Сообщений: 280
11.03.2010, 15:56 #6
Цитата Сообщение от Krist_ALL Посмотреть сообщение
Допустим, но что тогда значит
C++
1
2
3
int a[5];
int *p;
p = a;
Теперь это значит, что

p[2] == a[2]
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.03.2010, 19:03 #7
int a[5];
int *p;
p = a;
Это значит что p хранит адрес начала массива, так же как и a
Имя p можно использовать так же как и a: p[0]=2 p[1] и т д.
0
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.03.2010, 19:05 #8
все еще проще: имя массива выступает в роли ссылки не его первый элемент. этого достаточно. )
&m[0] - это адрес первого (нулевого) элемента. он равено просто m
&m[0] тождественно равно m;
C++
1
2
3
4
int m[256];
int *iptr;
iptr=m;
iptr[i]=x;
и еще кое что - нужно представить себе:
переменная - имя ячейки. указатель имя ячейки, в которой лежит адрес переменной
& - оперптор взятия адреса своего операнда.
& от указателя вернет адрес ячейки в которой лежит адрес ячейки, т.е. адрес указателя
* это оператор перехода по адресу который содержит его операнд.
* от указателя вернет то что указывает его содержимое. т.е операнд на который указывает указатель.

кстати, можно брать адрес любого элемента.
&m[i] - адрес i-ого элемента. оператор [] имеет более высокий приоритет чем оператор &, посему сначало выполняется "выбор" элемента потом взятие его адреса.проде как &(m[i])

еще следует помнить что такие массивы располагаются в памяти последовательно. каждый элемент - один за другим.
[0|1|2|3|4|5|6]
так что
(&m+2) - это элменет с индексом 2.
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.03.2010, 19:08 #9
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива

В данном случае этот тезис не подходит так как если делать & мы берем адрес указателя на начало
массива и не адрес начала массива.

Добавлено через 2 минуты
Krist_ALL вот тебе ссылка, увидев это ты удивишься:
Бесконечность и далее...
0
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.03.2010, 19:09 #10
с массивами исключение. вообще я это все сказал для образного понимания дела
0
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.03.2010, 20:35  [ТС] #11
int a[20];
int *p;
p = a; p присвоили АДРЕС ПЕРВОГО элемента массива да?
p = &a; Адрес адреса получается.. т.к. &-взятие адреса от а(0х123456)
непойму
0
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.03.2010, 20:49 #12
да так и есть
&a и a это одно и тоже. только так: p=&a компилятор не разрешает.
a - адрес первого элемента в массиве, он совпадает с адресом самого массива - это логично.
массив:
[0|1|2|3|4|5]
^
первый элемент, онже начано массива. почитай предисловие и введение к книжке по ассемблеру тогда тебе точно станет ясно доконца.
обращаться к i-тому элементу так например: *(a+i)
C++
1
2
3
int a[23];
*(a+3)=45;
 cout << *(a+3) << endl;
главное понимать что все что определяется так:
имя_типа ИМЯ_МАССИВА[размер_массива]; или так: имя_типа * ИМЯ_УКАЗАТЕЛЯ=new ИМЯ_ТИПА[размер_массива]; все это располагается в памяти непрерывно, последовательно. И & взятие дреса того что после него написано. * разименование адреса того что после него написано
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.03.2010, 21:18 #13
&a и a это одно и тоже. только так: p=&a компилятор не разрешает.
Не одно и тоже.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream.h>
int main(){
int a[10] = {2,3,4,5,6};
int *i = a;          //берём адрес первого элемента массива.
int **p = &i;       //вот мы берём адрес  указателя i, а не адрес начала массива.
cout<<**p;        //разыменуем двойной указатель(+указатель который хранит двойной указатель) 
//и обращаемся к первому элементу массива.
 
return 0;
}
0
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.03.2010, 21:24 #14
одно одно )))
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int m[30];
    cout << &m << '\t' << m << endl;
    getch();
    return 0;
}
1
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,482
11.03.2010, 21:28 #15
Хе...
Пища для размышления
Парадокс: значение переменной равно её адресу
0
11.03.2010, 21:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2010, 21:28
Привет! Вот еще темы с ответами:

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Про указатели - C++
В среде C++ Builder разбираюсь с логикой работы с указателями. По определению (в моем его понимании) указатель это адрес в памяти на...

Про указатели . - C++
Всем привет: Продолжаю свою традицию: Вот придумал необычную задачку, может кому то она покажется неинтересной, сложная или простая...


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

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

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