Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/50: Рейтинг темы: голосов - 50, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25

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

28.11.2011, 16:03. Показов 11293. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.11.2011, 16:03
Ответы с готовыми решениями:

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

Ошибка при работе с массивами
Здравствуйте. Хочу сделать программу, которая сортирует цифры. Вот код: #include &lt;iostream&gt; using namespace std; int...

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

111
Заблокирован
30.11.2011, 02:01
Студворк — интернет-сервис помощи студентам
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
Заблокирован
30.11.2011, 02:05
Не совсем уловил этот момент:
Цитата Сообщение от Сыроежка Посмотреть сообщение
int a[] = { 1 };
int p = a;
error C2440: инициализация: невозможно преобразовать 'int [1]' в 'int'

Вы ж переменой инт указатель пытаетесь впиндюрить
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
30.11.2011, 02:06
Цитата Сообщение от 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;
}
Code
1
2
3
$ ./array_pointer 
400
4
Ой, чё это?

Не по теме:

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

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


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

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

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

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
 Аватар для alkagolik
1599 / 622 / 113
Регистрация: 15.07.2011
Сообщений: 3,548
30.11.2011, 02:37
Цитата Сообщение от easybudda Посмотреть сообщение
C
1
2
3
4
5
6
7
#include <stdio.h>
int main(void)
{ 
    int arr[100], * ptr = arr;
    printf("%d\n%d\n", sizeof(arr), sizeof(ptr));
    return 0;
}
мне кажется вы немного лукавите.
0
 Аватар для Гоблин
1 / 1 / 1
Регистрация: 17.10.2010
Сообщений: 29
30.11.2011, 11:11
Вот здесь достаточно понятно все расписано про явные и неявные указатели.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.11.2011, 11:35
Цитата Сообщение от Bers Посмотреть сообщение
Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
Так и есть, но за исключением понимания массива функцией sizeof. Поэтому не сам указатель, а сущность, с которой этот указатель ассоциирован, а кроме него с той же сущностью ассоциировано количество элементов массива.
0
Заблокирован
30.11.2011, 11:59
Цитата Сообщение от taras atavin Посмотреть сообщение
Так и есть, но за исключением понимания массива функцией sizeof. Поэтому не сам указатель, а сущность, с которой этот указатель ассоциирован, а кроме него с той же сущностью ассоциировано количество элементов массива.
Могу лишь сказать, что написана полная глупость человека, который не знает, что такое массивы. Вы бы хоть посмотрели пример, который я здесь привел выше, прежде, чем писать свою глупость.
0
Заблокирован
30.11.2011, 14:20
Гоблин, там достаточно понятно написанно, потому что очень много вольностей допущено в изложении) От простого к сложному)

Допустим, вот эта фраза не корректная "указатель - переменная, содержащая информацию о расположении в памяти другой переменной"(ц)

То есть, материал преподносится так, что бы читатель, который не в теме, сумел понять)

На самом деле, указатель - это не всегда переменная.
Но всегда он содержит адрес. Причем, никаких "переменных" по этому адресу не живёт. А живет там тупо кучка какие то байтов.
О том, что именно там на самом деле живет, знает либо программист. Либо тип самого указателя, который хранит этот адрес.

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


Вот тебе банальный пример:

C++
1
2
3
4
5
char* text = "Привет, мир!"; //в правой части мы имеем неявное 
                                          //преобразование литерной константы,
                                          // сначала к массиву, а затем и к указателю.
//Но в правой части нет никаких явных указателй
//И нет никаких переменных. А вот неявный указатель есть

C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    char* Ptr = "ghbdtn"; //только не понятно, 
                                    //почему студия разрешает 
                                   //такое делать
 
    Ptr[0]='t'; //ведь можно сделать вот так, 
                   //и получить крэш
    
    EndProgramm();
}
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.11.2011, 14:30
Цитата Сообщение от Bers Посмотреть сообщение
На самом деле, указатель - это не всегда переменная.
Цитата Сообщение от Bers Посмотреть сообщение
char* text
А это разве не переменная?
0
Заблокирован
30.11.2011, 14:39
Цитата Сообщение от fasked Посмотреть сообщение
А это разве не переменная?
переменная.

"Привет мир" - это разве переменная?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.11.2011, 14:51
Bers, происходит array-to-pointer conversion, в результате указатель хранит адрес первого элемента массива, который (первый элемент) является переменной.
0
Заблокирован
30.11.2011, 14:54
Цитата Сообщение от fasked Посмотреть сообщение
Bers, происходит array-to-pointer conversion, в результате указатель хранит адрес первого элемента массива, который (первый элемент) является переменной.
Ну да. Вот этот вот неявный указатель с правой стороны, который появился благодаря неявным преобразованиям.

Вот он будет ли являться переменной? Или не будет?

Как минимум, этот временный объект не будет являться переменной, потому что будет являться константным.


Единственное, этот первый элемент не будет являться переменной. Это будет всего лишь какой то безымяный байт. Попытаетесь изменить - получите крыш
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.11.2011, 15:18
A variable is introduced by the declaration of a reference other than a non-static data member or of an object. The variable’s name denotes the reference or object.
Примерно так
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
30.11.2011, 15:31

Не по теме:

Цитата Сообщение от Bers Посмотреть сообщение
Ну да...
Никогда не думай, что ты иная, чем могла бы быть, иначе, чем будучи иной в тех случаях, когда иначе не быть нельзя!
(с) Л. Кэррол feat. С. Маршак
Напомнило...


Bers, охота Вам лезть в такие дебри и запутывать себя и окружающих? Строковый литерал - это последовательность байт в памяти, начинающаяся с определённого адреса. Вот именно этот адрес и становится значением переменной-указателя. Обе строки выводятся с одинаковым успехом:
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
    
int main(void){
    const char * p1 = "Hello, world!";
    const char * p2 = &("Goodbye, world!"[0]);
    
    printf("%s\n%s\n", p1, p2);
    
    return 0;
}
1
Заблокирован
30.11.2011, 15:45
Цитата Сообщение от easybudda Посмотреть сообщение
Bers, охота Вам лезть в такие дебри и запутывать себя и окружающих? Строковый литерал - это последовательность байт в памяти, начинающаяся с определённого адреса. Вот именно этот адрес и становится значением переменной-указателя. Обе строки выводятся с одинаковым успехом:
Да, именно так. Если по простому. И если не вникать в "закулисную" кухню с++.
А тем не менее, знание этой самой закулисной кухни в определённых ситуациях может дать определённый профит. Например - сэкономить на копирующих конструкторах.

А правило то на самом деле простое:

some1 obj1 = some2 obj2;

Гибкость С++ в том, что он позволяет твердому присваивать мягкое.
Однако! На самом деле твердому можно присвоить только твёрдое.
В случае любых несоответствий правая часть всегда будит неявно приведена к типу данных левой части. А что там именно за скрытые преобразования будут происходить - это уже от ситуации зависит.
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
30.11.2011, 15:47
Цитата Сообщение от Bers Посмотреть сообщение
Гибкость С++ в том, что он позволяет твердому присваивать мягкое.
Однако! На самом деле твердому можно присвоить только твёрдое.
Это Вы так строгую типизацию называете?
0
Заблокирован
30.11.2011, 15:51
Цитата Сообщение от fasked Посмотреть сообщение
Это Вы так строгую типизацию называете?
Как? "так" ?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.11.2011, 15:52
Ну твёрдости присвоить "мягко" - не фокус. Плюсы же позволяют твёрдости присвоить зелень, а температуре - алмаз. Причём, автор мнимых граблей полиморфизма и все, кто в эти грабли поверил, будут в обоих случаях юзить преобразование запаха в химическую формулу, что в корне не верно, но язык то в том не виноват.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.11.2011, 15:52
Помогаю со студенческими работами здесь

Использование показателей при работе с массивами
n натуральное, a1,...,an действительные числа. Найти : a1a2n+a2a2n-1+...+anan+1

Использование показателей при работе с массивами
Даны a1,...,an действительные числа, n* натуральное число. Если в этой последовательности присутствуют три меньших числа,вывести на экран...

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru