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

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

Восстановить пароль Регистрация
 
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
11.03.2010, 14:20     Вопрос про указатели на массивы #1
В книге написано
C++
1
2
3
4
int a[5];
int *p;
p = &a; //У меня выдает ошибку
p = &a[0]; //Так работает
p = ПОЛУЧИТЬ_адрес_объекта - Это же только применимо к переменным. а когда указатеь на массив надо писать без & (мля опять забыл почему( )

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

Вопрос про указатели C++
Вопрос по программе на тему: Массивы и указатели. Динамическое выделение памяти C++
C++ Вопрос про указатели
C++ Опят про указатели)
Про указатели . C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
11.03.2010, 14:25     Вопрос про указатели на массивы #2
так как
Цитата Сообщение от Krist_ALL Посмотреть сообщение
p = &a
p присваивается адрес указателя на массив целых чисел... ошибка потому , чтоб её не было надо сделать так int **p
Krist_ALL
 Аватар для 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; //Адрес из адреса???
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
11.03.2010, 14:41     Вопрос про указатели на массивы #4
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива
Krist_ALL
 Аватар для 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;
Alexandoros
226 / 64 / 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]
Genius Ignat
1233 / 771 / 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] и т д.
Aye Aye
 Аватар для 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.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.03.2010, 19:08     Вопрос про указатели на массивы #9
ну правильно имя массива - указатель на кусок памяти под этот массив, &- операция взятия адреса, поэтому ты берешь адрес ячейки, в которой написан адрес массива

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

Добавлено через 2 минуты
Krist_ALL вот тебе ссылка, увидев это ты удивишься:
Бесконечность и далее...
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
11.03.2010, 19:09     Вопрос про указатели на массивы #10
с массивами исключение. вообще я это все сказал для образного понимания дела
Krist_ALL
 Аватар для 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)
непойму
Aye Aye
 Аватар для 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 ИМЯ_ТИПА[размер_массива]; все это располагается в памяти непрерывно, последовательно. И & взятие дреса того что после него написано. * разименование адреса того что после него написано
Genius Ignat
1233 / 771 / 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;
}
Aye Aye
 Аватар для 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;
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
11.03.2010, 21:28     Вопрос про указатели на массивы #15
Хе...
Пища для размышления
Парадокс: значение переменной равно её адресу
Genius Ignat
1233 / 771 / 44
Регистрация: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2010, 21:40     Вопрос про указатели на массивы
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,265
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;
}

НУ вот как раз в той теме, ссылку на которую я дал ребята подробным образом всё это объясняют!
Почему значение переменной равно адресу переменной (речь идёт о массивах, понятно)
Yandex
Объявления
11.03.2010, 21:40     Вопрос про указатели на массивы
Ответ Создать тему
Опции темы

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