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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 46, средняя оценка - 4.65
chainiksi
0 / 0 / 0
Регистрация: 15.11.2011
Сообщений: 25
28.11.2011, 16:03     Как использовать указатели при работе с массивами? #1
подскажите пожалуйста как правильно использовать указатели при работе с массивами. Как написать этк программу используя указатели?
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]и т.п.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
30.11.2011, 02:05     Как использовать указатели при работе с массивами? #42
Не совсем уловил этот момент:
Цитата Сообщение от Сыроежка Посмотреть сообщение
int a[] = { 1 };
int p = a;
error C2440: инициализация: невозможно преобразовать 'int [1]' в 'int'

Вы ж переменой инт указатель пытаетесь впиндюрить
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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 Посмотреть сообщение
Я конечно понимаю, что тарасовская терминология, которую я нахожу не столько терминологией, сколько "называнием вещей своими именами" может быть упоротая)))
Ну у Вас и собственных оригинальных трактовок всевозможных терминов хоть отбавляй...

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


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

Вы ж переменой инт указатель пытается впиндюрить
Там опечатка. Правильно должно быть int *p = a;
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 Посмотреть сообщение
Ну у Вас и собственных оригинальных трактовок всевозможных терминов хоть отбавляй...
Не нужно путать понятие "термин" с понятием "называние вещи своим именем"

Вот "массив" - это термин. "указатель" - это термин.
Явный указатель, или неявный указатель - это не термины, это описания указателей)
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
30.11.2011, 02:37     Как использовать указатели при работе с массивами? #46
Цитата Сообщение от 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;
}
мне кажется вы немного лукавите.
Гоблин
 Аватар для Гоблин
1 / 1 / 0
Регистрация: 17.10.2010
Сообщений: 29
30.11.2011, 11:11     Как использовать указатели при работе с массивами? #47
Вот здесь достаточно понятно все расписано про явные и неявные указатели.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.11.2011, 11:35     Как использовать указатели при работе с массивами? #48
Цитата Сообщение от Bers Посмотреть сообщение
Кстати, всегда думал, что "массив" на с++ это и есть указатель на первый элемент массива.
Так и есть, но за исключением понимания массива функцией sizeof. Поэтому не сам указатель, а сущность, с которой этот указатель ассоциирован, а кроме него с той же сущностью ассоциировано количество элементов массива.
Сыроежка
Заблокирован
30.11.2011, 11:59     Как использовать указатели при работе с массивами? #49
Цитата Сообщение от taras atavin Посмотреть сообщение
Так и есть, но за исключением понимания массива функцией sizeof. Поэтому не сам указатель, а сущность, с которой этот указатель ассоциирован, а кроме него с той же сущностью ассоциировано количество элементов массива.
Могу лишь сказать, что написана полная глупость человека, который не знает, что такое массивы. Вы бы хоть посмотрели пример, который я здесь привел выше, прежде, чем писать свою глупость.
Bers
Заблокирован
30.11.2011, 14:20     Как использовать указатели при работе с массивами? #50
Гоблин, там достаточно понятно написанно, потому что очень много вольностей допущено в изложении) От простого к сложному)

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

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

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

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


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

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();
}
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2011, 14:30     Как использовать указатели при работе с массивами? #51
Цитата Сообщение от Bers Посмотреть сообщение
На самом деле, указатель - это не всегда переменная.
Цитата Сообщение от Bers Посмотреть сообщение
char* text
А это разве не переменная?
Bers
Заблокирован
30.11.2011, 14:39     Как использовать указатели при работе с массивами? #52
Цитата Сообщение от fasked Посмотреть сообщение
А это разве не переменная?
переменная.

"Привет мир" - это разве переменная?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2011, 14:51     Как использовать указатели при работе с массивами? #53
Bers, происходит array-to-pointer conversion, в результате указатель хранит адрес первого элемента массива, который (первый элемент) является переменной.
Bers
Заблокирован
30.11.2011, 14:54     Как использовать указатели при работе с массивами? #54
Цитата Сообщение от fasked Посмотреть сообщение
Bers, происходит array-to-pointer conversion, в результате указатель хранит адрес первого элемента массива, который (первый элемент) является переменной.
Ну да. Вот этот вот неявный указатель с правой стороны, который появился благодаря неявным преобразованиям.

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

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


Единственное, этот первый элемент не будет являться переменной. Это будет всего лишь какой то безымяный байт. Попытаетесь изменить - получите крыш
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2011, 15:18     Как использовать указатели при работе с массивами? #55
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.
Примерно так
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
30.11.2011, 15:31     Как использовать указатели при работе с массивами? #56

Не по теме:

Цитата Сообщение от 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;
}
Bers
Заблокирован
30.11.2011, 15:45     Как использовать указатели при работе с массивами? #57
Цитата Сообщение от easybudda Посмотреть сообщение
Bers, охота Вам лезть в такие дебри и запутывать себя и окружающих? Строковый литерал - это последовательность байт в памяти, начинающаяся с определённого адреса. Вот именно этот адрес и становится значением переменной-указателя. Обе строки выводятся с одинаковым успехом:
Да, именно так. Если по простому. И если не вникать в "закулисную" кухню с++.
А тем не менее, знание этой самой закулисной кухни в определённых ситуациях может дать определённый профит. Например - сэкономить на копирующих конструкторах.

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

some1 obj1 = some2 obj2;

Гибкость С++ в том, что он позволяет твердому присваивать мягкое.
Однако! На самом деле твердому можно присвоить только твёрдое.
В случае любых несоответствий правая часть всегда будит неявно приведена к типу данных левой части. А что там именно за скрытые преобразования будут происходить - это уже от ситуации зависит.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
30.11.2011, 15:47     Как использовать указатели при работе с массивами? #58
Цитата Сообщение от Bers Посмотреть сообщение
Гибкость С++ в том, что он позволяет твердому присваивать мягкое.
Однако! На самом деле твердому можно присвоить только твёрдое.
Это Вы так строгую типизацию называете?
Bers
Заблокирован
30.11.2011, 15:51     Как использовать указатели при работе с массивами? #59
Цитата Сообщение от fasked Посмотреть сообщение
Это Вы так строгую типизацию называете?
Как? "так" ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2011, 15:52     Как использовать указатели при работе с массивами?
Еще ссылки по теме:

C++ Использование функций при работе с двумерными массивами
C++ Проблемма при работе с массивами структур
Ошибка с памятью при работе с двумерными массивами. C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
30.11.2011, 15:52     Как использовать указатели при работе с массивами? #60
Ну твёрдости присвоить "мягко" - не фокус. Плюсы же позволяют твёрдости присвоить зелень, а температуре - алмаз. Причём, автор мнимых граблей полиморфизма и все, кто в эти грабли поверил, будут в обоих случаях юзить преобразование запаха в химическую формулу, что в корне не верно, но язык то в том не виноват.
Yandex
Объявления
30.11.2011, 15:52     Как использовать указатели при работе с массивами?
Закрытая тема Создать тему
Опции темы

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