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

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

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

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

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

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

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

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

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

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

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 вот тебе ссылка, увидев это ты удивишься:
http://www.cyberforum.ru/programming-theory/thread96408.html
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
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
11.03.2010, 21:28 #15
Хе...
Пища для размышления
http://www.cyberforum.ru/cpp-beginners/thread53148.html
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
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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
Привет! Вот еще темы с решениями:

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

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

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

Структуры, массивы, указатели, динамические массивы структур
Помогите с решением задачи (прикрепляю условие). Заранее спасибо.


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

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

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