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

Указатели. - C++

Восстановить пароль Регистрация
 
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
11.04.2011, 22:47     Указатели. #1
Да в конце концов, хочу понять и выучить эти указатели.
Немного понял, но все же проблемы и хочу узнать ваши советы.

практиковался программой(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;
}
короче иногда вычисляет верно иногда на единицу больше ответ а иногда вообще хз.

вообщем так. привидите пример как правильно обозначить указатель на одномерный массив, двумерный, и соответственно передать в функцию. я уже заколебался.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2011, 22:47     Указатели.
Посмотрите здесь:

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

Добавлено через 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% гарантии не даю, т.к. сам редко пользуюсь.
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
11.04.2011, 23:52  [ТС]     Указатели. #10
neske, допустим есть массив
x=5; y=10;
arr[x][y];, то как его правильно передать и использовать *
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
11.04.2011, 23:55     Указатели. #11
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;
}
Вот так.
А если заранее не знаешь сколько строк у тебя будет и столбцов, то по-другому всё, это читай про динамическое выделение памяти.
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
12.04.2011, 00:14  [ТС]     Указатели. #12
kravam, мне не надо передавать в функцию весь массив. а если например числа будут огромные и массив огромный?....
только и только указатели меня интересуют.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.04.2011, 00:36     Указатели. #13
Хм, а в книгах пишут, что при такм синтаксисе в функцию передаются именно УКАЗАТЕЛЬ на массив
Проверяй, адреса элементов одинаковы, что в вызывающей, что в вызываемой функции
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;
}
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
12.04.2011, 01:10  [ТС]     Указатели. #14
Цитата Сообщение от kravam Посмотреть сообщение
int p [3] [5]

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

Добавлено через 1 минуту
в любом случае спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2011, 01:16     Указатели.
Еще ссылки по теме:

Указатели C++
C++ Указатели
C++ Указатели

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
12.04.2011, 01:16     Указатели. #15
Не суть. Важно, что это с точки зрения КОМПИЛЯТОРА

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

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

(Особняком стоит вопрос- что представляет из себя указатель на массив в данном случае. То ли это указатель на нулевой элемент, то ли ещё что, раньше я разбирался с этим, а щас подзабыл уже. Но неважно. Указатель на массив и всё. А хочешь- углубись. Хотя не знаю, почему тебя не убедил вывод адресов элементов в вызываемой ми вызывающей функции)
Yandex
Объявления
12.04.2011, 01:16     Указатели.
Ответ Создать тему
Опции темы

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