Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Krist_ALL
9 / 9 / 2
Регистрация: 01.02.2010
Сообщений: 317
1

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

11.03.2010, 14:20. Просмотров 749. Ответов 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
Ответы с готовыми решениями:

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

Вопрос про указатели
char *a = "s"; 1. Выделяется место в памяти 2. В это место записывается s...

Про массивы и указатели
#include <iostream> using namespace std; int Digit = {...

Про указатели, массивы, new/delete и красивости /* удалить/вставить в массив */
Тут много тем с вопросами "удалить\вставить из\в массив" Не нравились они мне,...

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

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

int a[5];
int *p;
p = a; //Присвоили адрес т.к a хранит адрес на память где храняться числа.
p = &a; //Адрес из адреса???
0
User1990
26 / 26 / 11
Регистрация: 03.11.2009
Сообщений: 158
11.03.2010, 14:41 4
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива
0
Krist_ALL
9 / 9 / 2
Регистрация: 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 / 11
Регистрация: 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
1241 / 779 / 108
Регистрация: 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
370 / 284 / 97
Регистрация: 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
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
11.03.2010, 19:08 9
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива

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

Добавлено через 2 минуты
Krist_ALL вот тебе ссылка, увидев это ты удивишься:
Бесконечность и далее...
0
Aye Aye
370 / 284 / 97
Регистрация: 17.12.2009
Сообщений: 567
11.03.2010, 19:09 10
с массивами исключение. вообще я это все сказал для образного понимания дела
0
Krist_ALL
9 / 9 / 2
Регистрация: 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
370 / 284 / 97
Регистрация: 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
1241 / 779 / 108
Регистрация: 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
370 / 284 / 97
Регистрация: 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
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
11.03.2010, 21:28 15
Хе...
Пища для размышления
Парадокс: значение переменной равно её адресу
0
Genius Ignat
1241 / 779 / 108
Регистрация: 16.09.2009
Сообщений: 2,014
11.03.2010, 21:35 16
//Такие эксперименты я не делал, интересный закон, для массивов.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
    int m[30];
    cout << &m << '\t' << m << endl;
    int *p=&m[0];  //компромисс 
    getch();
    return 0;
}
1
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,531
11.03.2010, 21:40 17
И прекращайте называть нулевой элемент первым.

Добавлено через 3 минуты
Цитата Сообщение от Aye Aye Посмотреть сообщение
одно одно )))

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
11.03.2010, 21:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2010, 21:40

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

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

Указатели и массивы. Указатели и функции
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо...


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

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

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