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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.65
chainiksi
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25
#1

Как использовать указатели при работе с массивами? - C++

28.11.2011, 16:03. Просмотров 6418. Ответов 111
Метки нет (Все метки)

подскажите пожалуйста как правильно использовать указатели при работе с массивами. Как написать этк программу используя указатели?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 #include<iostream>
 using namespace std;
 const int n = 10;
 int main()
 {
 int X[n] = {1,2,3,4,5,6,7,8,9,10};
 int Y[n]= {2,3,4,6,7,3,4,5,1,9,};
 int Z[n]= {1,2,3,4,5,6,7,8,9,0};
 int U[n];
 for (int i = 0; i < n; i++)
 {
 U[i]=X[i]+Y[i]-Z[i];
 cout<<U[i]<<" ";
 }
 cout << endl;
 system("pause");
 }
если я правильно понял *X - это тоже самое, что и X[0] , а как написать при помощи указателей к примеру X[4]и т.п.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2011, 16:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как использовать указатели при работе с массивами? (C++):

Указатели при работе с одномерными и двумерными массивами - C++
Помогите Даны натуральное число n, целые числа а1,...,аn . Выяснить, имеется ли среди чисел а1,...,аn совпадающие.

Проблемма при работе с массивами структур - C++
Разработать программу , позволяющую добавлять данные структур с указанными полями в массив, просматривать массивы, а также выполнять...

Ошибка при работе с массивами char - C++
Задание: написать функцию для сложения целых двоичных чисел. Слагаемые должны иметь тип unsigned char. Вот что получилось, но после...

Не получается перегрузить оператор ++ при работе с массивами - C++
Текст: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...

Ошибка с памятью при работе с двумерными массивами. - C++
{ int i, j, c, kol; n=StrToInt(Edit1-&gt;Text); m=StrToInt(Edit2-&gt;Text); for(i=0; i&lt;n; i++) { for(j=0; j&lt;m; j++)...

Ошибка в перегрузке оператора - при работе с массивами - C++
Текст программы: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; class array { public: array(); ...

111
Bers
Заблокирован
30.11.2011, 00:17 #31
Цитата Сообщение от Гоблин Посмотреть сообщение
Либо поиском пользоваться разучился, либо действительно нет ничего вменяемого по теме. Может кто ни будь сможет объяснить что такое явный и неявный указатель?
C++
1
2
3
4
5
SomeClass* Ptr = NULL; //явный указатель
 
 (Ptr+2) -> Method();  //Выражение слева в скобках породит 
                                 //неявный, временный указатель
                                 // через который будит запущен метод
Неявные указатели - это самые обычные указатели, которые создаются скрытно от программиста.
Как правило, они являются "временными" объектами.
1
Сыроежка
Заблокирован
30.11.2011, 00:26 #32
Цитата Сообщение от Bers Посмотреть сообщение
C++
1
2
3
4
5
SomeClass* Ptr = NULL; //явный указатель
 
 (Ptr+2) -> Method();  //Выражение слева в скобках породит 
                                 //неявный, временный указатель
                                 // через который будит запущен метод
Неявные указатели - это самые обычные указатели, которые создаются скрытно от программиста.
Как правило, они являются "временными" объектами.
Я просмотрел стандарт С++ и не нашел там такого термина, как "неявные указатели".
1
alkagolik
Заблокирован
30.11.2011, 00:30 #33
Bers, это понятно, а как будет выглядеть в Си?

Добавлено через 4 минуты
боюсь что товарищ тарас просто ввел всех в заблуждение
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2011, 00:34 #34
Цитата Сообщение от alkagolik Посмотреть сообщение
это понятно, а как будет выглядеть в Си?
В стандарте Си тоже нет такого термина.
Цитата Сообщение от alkagolik Посмотреть сообщение
боюсь что товарищ тарас просто ввел всех в заблуждение
Любят же некоторые выдумывать собственную терминологию. А потом еще хотят, чтобы их понимали остальные.
0
Bers
Заблокирован
30.11.2011, 01:28 #35
Да причем тут терминология вообще? Указатель, который создаётся неявно - это блин, неявный указатель. Указатель, который создаётся явно - явный.
0
Сыроежка
Заблокирован
30.11.2011, 01:33 #36
Цитата Сообщение от Bers Посмотреть сообщение
Да причем тут терминология вообще? Указатель, который создаётся неявно - это блин, неявный указатель. Указатель, который создаётся явно - явный.
Подайте свое предложение в комитет по стандартизации. Если тот примет ваше предложение, то будем пользоваться вашими терминами. А пока в стандарте есть термины о явных и неявных преобразованиях типов выражений. Например, массив неявно преобразуется в указатель на его первый элемент при передачи массива в качестве аргумента функции, если параметр объявлен как массив. Но тем не менее указатель от этого не становится неявным. То есть я хочу сказать, что ваша терминология вашего определение указателя может лишь запутывать других.

Дело в том, что, например, в стандарте встречается выражение "явный указатель" (explicit pointer), но несколько в ином смысле, чем вы это себе представляете.
0
Bers
Заблокирован
30.11.2011, 01:41 #37
Цитата Сообщение от Сыроежка Посмотреть сообщение
Дело в том, что, например, в стандарте встречается выражение "явный указатель" (explicit pointer), но несколько в ином смысле, чем вы это себе представляете.
В каком?

Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
То бишь, на с++ никаких "массивов" не существует. Существуют непрерывные блоки памяти, и указатель на первый элемент.
0
Сыроежка
Заблокирован
30.11.2011, 01:46 #38
Цитата Сообщение от Bers Посмотреть сообщение
В каком?

Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
То бишь, на с++ никаких "массивов" не существует. Существуют непрерывные блоки памяти, и указатель на первый элемент.
То же неправильный вывод. В С/С++ массивы существуют. Просто имя массива не является lvalue и является синонимом адреса массива.
0
Bers
Заблокирован
30.11.2011, 01:50 #39
Вот например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Some 
{  
    int a; 
    void View() { std::cout <<"ля-ля-ля\n";}
};
 
int main()
{
 
    STD;
 
    Some test; test.a;
    Some* ptr= &test;
 
    ptr[0].View(); //яж массив не создавал,
                        // но тем менее это работает
 
    ptr[100].View(); //хи-хи-хи
 
    //И кстати, работа с указателем посредством индекса
    //Предполагает создание временного объекта
    //Тобишь, доступ к данным, через неявный указатель. 
  
    EndProgramm();
}
Добавлено через 2 минуты
Цитата Сообщение от Сыроежка Посмотреть сообщение
То же неправильный вывод. В С/С++ массивы существуют. Просто имя массива не является lvalue и является синонимом адреса массива.
Я конечно понимаю, что тарасовская терминология, которую я нахожу не столько терминологией, сколько "называнием вещей своими именами" может быть упоротая)))

Но вопрос остаётся в силе: почему ж тогда семантика работы с "массивом" на с++ и семантика работы с "указателем" на с++ - абсолютно идентичная?

Чем тогда вообще массив принципиально отличается от указателя на первый элемент блока данных?
0
alkagolik
Заблокирован
30.11.2011, 01:55 #40
Bers, массив, это вообще аппаратный термин, просто он перекочевал в высокоуровневое программирование (наверное для облегчения понимания, неважно), а фактически да, вы правы. А по указателям, так нету никаких явных или неявных, есть просто указатели, как реализация метода адресации.

Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
В стандарте Си тоже нет такого термина.
это был вопрос "с подвохом"
0
Сыроежка
Заблокирован
30.11.2011, 02:01 #41
Bers,

По поводу explicit pointer, то я ошибся. Я просто искал по заданному ключевому сочетанию и нашел его использование, но слово explicit в той фразе не относится именно к слову pointer, а относится к группе слов, разделенных запятыми.

"Except by using explicit pointers, references, and object names, declarations in a nested class can use only..."

То есть имеется в виду что "за исключением явного использования указателей, ссылок, имен объектов объявления во вложенном классе могут использовать только ..."

Добавлено через 5 минут
Цитата Сообщение от Bers Посмотреть сообщение
Вот например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Some 
{  
    int a; 
    void View() { std::cout <<"ля-ля-ля\n";}
};
 
int main()
{
 
    STD;
 
    Some test; test.a;
    Some* ptr= &test;
 
    ptr[0].View(); //яж массив не создавал,
                        // но тем менее это работает
 
    ptr[100].View(); //хи-хи-хи
 
    //И кстати, работа с указателем посредством индекса
    //Предполагает создание временного объекта
    //Тобишь, доступ к данным, через неявный указатель. 
  
    EndProgramm();
}
Добавлено через 2 минуты


Я конечно понимаю, что тарасовская терминология, которую я нахожу не столько терминологией, сколько "называнием вещей своими именами" может быть упоротая)))

Но вопрос остаётся в силе: почему ж тогда семантика работы с "массивом" на с++ и семантика работы с "указателем" на с++ - абсолютно идентичная?

Чем тогда вообще массив принципиально отличается от указателя на первый элемент блока данных?
Нет, семантика на самом деле не совсем одинаковая. Рассмотрите пример

C++
1
2
3
4
5
6
7
8
9
10
void f( int ( &a )[1] ) {}
 
int main()
{
   int a[] = { 1 };
   int p = a;
 
   f( a );
   f( p );
}
Просто в выражении из вашего примера ptr[100], а это выражение, ptr преобразуется в указатель на первый элемент массива. Оно эквивалентно в частности выражению 100 + ptr
0
Bers
Заблокирован
30.11.2011, 02:05 #42
Не совсем уловил этот момент:
Цитата Сообщение от Сыроежка Посмотреть сообщение
int a[] = { 1 };
int p = a;
error C2440: инициализация: невозможно преобразовать 'int [1]' в 'int'

Вы ж переменой инт указатель пытаетесь впиндюрить
0
easybudda
Модератор
Эксперт CЭксперт С++
9693 / 5643 / 962
Регистрация: 25.07.2009
Сообщений: 10,847
30.11.2011, 02:06 #43
Цитата Сообщение от Bers Посмотреть сообщение
Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(void){
    int arr[100], * ptr = arr;
    
    printf("%d\n%d\n", sizeof(arr), sizeof(ptr));
    
    return 0;
}
Код
$ ./array_pointer 
400
4
Ой, чё это?

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Я конечно понимаю, что тарасовская терминология, которую я нахожу не столько терминологией, сколько "называнием вещей своими именами" может быть упоротая)))
Ну у Вас и собственных оригинальных трактовок всевозможных терминов хоть отбавляй...

1
Сыроежка
Заблокирован
30.11.2011, 02:07 #44
Цитата Сообщение от Bers Посмотреть сообщение
Не совсем уловил этот момент:


error C2440: инициализация: невозможно преобразовать 'int [1]' в 'int'

Вы ж переменой инт указатель пытается впиндюрить
Там опечатка. Правильно должно быть int *p = a;
0
Bers
Заблокирован
30.11.2011, 02:22 #45
Сыроежка, ну смысл я уловил, он различает разные массивы.
Выполняется проверка типа.

Даже если запихать массив, но другого размера, он это дело пофиксит:

C++
1
2
3
4
5
6
7
8
9
void f( int ( &a )[1] ) {}
int main()
{
    STD;
    int a[] = { 1,3 };
    f( a );
    //f: невозможно преобразовать параметр 1 из 'int [2]' в 'int (&)[1]'
    EndProgramm();
}
Раз происходит проверка типов, значит очевидно, что типы - различны.
Массив - название типа данных.

Добавлено через 2 минуты
Цитата Сообщение от easybudda Посмотреть сообщение
Ну у Вас и собственных оригинальных трактовок всевозможных терминов хоть отбавляй...
Не нужно путать понятие "термин" с понятием "называние вещи своим именем"

Вот "массив" - это термин. "указатель" - это термин.
Явный указатель, или неявный указатель - это не термины, это описания указателей)
0
30.11.2011, 02:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 02:22
Привет! Вот еще темы с ответами:

Использование функций при работе с двумерными массивами - C++
Дана прямоугольная вещественная матрица . Обнулить все четные столбцы и нечетные строки. В полученной матрице отсортировать по возрастанию...

Использование указателей при работе с одномерными массивами - C++
Реализовать на Си. Даны натуральное число n, действительные числа a1,...,an. Если последовательность a1,...,an упорядочена по...

Указатели при работе со строками char* - C++
Помогите разобраться с указателями #include &lt;iostream&gt; #include &lt;string.h&gt; using namespace std; int main() { char*...

Как работают указатели с массивами - C++
Хочу на простом примере перестановки двух элементов уяснить - как работают указатели с массивами, но ничего не получается. Объясните на...


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

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

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