Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340

Указатели.

11.04.2011, 22:47. Показов 1049. Ответов 14
Метки нет (Все метки)

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

практиковался программой(c помощью указателей и функции прога должна вычислить сумму элементов массива.
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
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void summ_arr(int *p, int *s)
{
     int sum=0;
     for(int i=0;i<*s;i++)
     {
          sum+=*p;
     }
     printf("summ = %d",sum);
}
int main()
{    int x=2;
     int *s;
     s=&x;
     int arr[x];
     srand(time(NULL));
     for(int j=0;j<x;j++)
     {
               arr[j]=rand()%9+1;
               printf(" %d ",arr[j]);
     }
          printf("\n");
int *p;
p=arr;
summ_arr(p,s);
return 0;
}
короче иногда вычисляет верно иногда на единицу больше ответ а иногда вообще хз.

вообщем так. привидите пример как правильно обозначить указатель на одномерный массив, двумерный, и соответственно передать в функцию. я уже заколебался.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.04.2011, 22:47
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++,...

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

14
60 / 60 / 17
Регистрация: 12.10.2010
Сообщений: 129
11.04.2011, 22:53
Оно кагбе не компилится...
0
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.04.2011, 22:57  [ТС]
Unforgiven_00, у тебя компилятор походу отличен от CodeBlocksGNU, если VisualStudio добавь #include "stdafx.h"
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
11.04.2011, 23:01
Если в функцию вы отправили адрес первого элемента (в вашем случае arr), а в функции его принимает какой-то указатель, пусть *p, то к элементам можно обращаться так же, как и раньше.
То есть уже в функции:
C++
1
p[0], p[1]
1
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.04.2011, 23:04  [ТС]
neske, очень помогло, теперь считает все верно. спасибо. в книге не было написано
0
60 / 60 / 17
Регистрация: 12.10.2010
Сообщений: 129
11.04.2011, 23:06
Цитата Сообщение от instagib Посмотреть сообщение
Unforgiven_00, у тебя компилятор походу отличен от CodeBlocksGNU, если VisualStudio добавь #include "stdafx.h"
проще написать
C++
1
const int x=2;
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
11.04.2011, 23:06
Можно так:
C++
1
2
3
4
5
     for(int i=0;i<*s;i++)
     {
          sum+=*p;
          p++; 
     }
1
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.04.2011, 23:09  [ТС]
короч как я понял, передав указатель на массив arr[x] в фунцкию, в последней можно обращаться как обычно только не arr а p[x];
а как быть с двумерными?
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
11.04.2011, 23:16
рад помочь)

Добавлено через 6 минут
Есть два варианта. В случае, если массив динамический, можно передать с помощью двойного указателя (указатель на указатель).
C++
1
2
3
4
void func (int **MAS, int Row, int Column);
//
func (MAS, Row, Column);
//
Или так:
C++
1
2
3
4
void func (int MAS[][Column], int Row);
//
func (MAS, Row);
//
На счет правильности второго варианта 100% гарантии не даю, т.к. сам редко пользуюсь.
0
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.04.2011, 23:52  [ТС]
neske, допустим есть массив
x=5; y=10;
arr[x][y];, то как его правильно передать и использовать *
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
11.04.2011, 23:55
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void summ_arr(int p [3] [5]){
 printf("%d", p [2] [4]);
}
 
int main() {
 int array [3] [5];    
 array [2] [4]= 67;
 summ_arr(array);
 getchar ();
return 0;
}
Вот так.
А если заранее не знаешь сколько строк у тебя будет и столбцов, то по-другому всё, это читай про динамическое выделение памяти.
1
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
12.04.2011, 00:14  [ТС]
kravam, мне не надо передавать в функцию весь массив. а если например числа будут огромные и массив огромный?....
только и только указатели меня интересуют.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
12.04.2011, 00:36
Хм, а в книгах пишут, что при такм синтаксисе в функцию передаются именно УКАЗАТЕЛЬ на массив
Проверяй, адреса элементов одинаковы, что в вызывающей, что в вызываемой функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
void summ_arr(int p [3] [5]){
 printf("%d\n", p [2] [4]);
 printf("%x", &p [2] [4]);
 
}
 
int main() {
 int array [3] [5];    
 array [2] [4]= 67;
 printf("%x\n", &array [2] [4]);
 summ_arr(array);
 getchar ();
return 0;
}
1
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
12.04.2011, 01:10  [ТС]
Цитата Сообщение от kravam Посмотреть сообщение
int p [3] [5]

kravam, это разве указатель? :O

Добавлено через 1 минуту
в любом случае спасибо
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
12.04.2011, 01:16
Не суть. Важно, что это с точки зрения КОМПИЛЯТОРА

C++
1
printf ("stroka");
Разве "stroka" это указатель? Нет, это массив символов. Но компилятор хитрый, он строку поместит хер знает куда, а вместо "stroka" положит в стек (все аргументы перед вызовом функции кладутся в область памяти, называемую стеком, откуда функция их и берёт после вызова) именно УКАЗАТЕЛЬ на эту строку.

Также и тут вместо абстрактного int p [3] [5] в стек положится именно УКАЗАТЕЛЬ на массив

(Особняком стоит вопрос- что представляет из себя указатель на массив в данном случае. То ли это указатель на нулевой элемент, то ли ещё что, раньше я разбирался с этим, а щас подзабыл уже. Но неважно. Указатель на массив и всё. А хочешь- углубись. Хотя не знаю, почему тебя не убедил вывод адресов элементов в вызываемой ми вызывающей функции)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.04.2011, 01:16
Помогаю со студенческими работами здесь

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть контейнер: vector &lt;Shape*&gt; Scontainer;...

Указатели на указатели: для чего они могут понадобятся?
Изучаю C++, дошёл до указателей на указатели. Там пишут что эта тема не обязательна. Для чего они могут понадобятся?

Зачем нужны все эти указатели (или не указатели)
Зачем надо DWORD, HANDLE, LPVOID?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки на предмет заполнения реквизитов реализован с целью установки значения по умолчанию,. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru