0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25

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

28.11.2011, 16:03. Показов 11932. Ответов 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,980
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,980
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
Закрытая тема Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru