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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
#1

Указатели и масивы - C++

23.01.2013, 16:12. Просмотров 646. Ответов 18
Метки нет (Все метки)

Добрый день.
Помогите пожалуйста разобраться с указателями.

Есть рабочий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const int n=5;
    int a [n][n];
 
    int k=1;
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            a[i][j]=k++;
        }
    }
 
    for (int i=0;i<n;i++)
    {
        for (int j=0;j<n;j++)
        {
            cout << *(*(a + i) + j) << " ";
        }
        cout << "\n";
    }
который инициализирует массив и выводит его на экран.

Насколько я понимаю а - есть указатель на указатель, исходя из выражения *(*(a + i) + j)

Вопрос: почему если я объявляю функцию:

C++
1
2
3
4
void func(int** a, int n)
       {
 
       }
и обращаюсь к ней как:

C++
1
 func(a,n);
компилятор выдает ошибку?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2013, 16:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели и масивы (C++):

Указатели/масивы - C++
Доброго времени суток Условие задачи: Создайте класс, который позволит вам использовать 10 отдельных массивов по 10 элементов, как один...

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

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

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

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

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
23.01.2013, 16:25 #2
Цитата Сообщение от fuelcs Посмотреть сообщение
исходя из выражения *(*(a + i) + j)
а исходя из этого:
C++
1
std::cout << *(&a[0][0]+i*n+j) << " ";
можно сделать вывод, что это одномерный массив интерпретируемый как двумерный
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.01.2013, 18:16  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
а исходя из этого:
C++
1
std::cout << *(&a[0][0]+i*n+j) << " ";
можно сделать вывод, что это одномерный массив интерпретируемый как двумерный
Насколько я понял a[0][0] - это указатель на первый элемент массива?

Код:

C++
1
cout << *(*a+i*n+j) << " ";
идентичен вашему? В чем разница между &a[0][0] и *a ?

Я еще попробовал записать так:

C++
1
cout << *(*(&a[0]+i) + j) << " ";
Что такое a[0] ?
Shepard90
5 / 5 / 0
Регистрация: 18.10.2010
Сообщений: 140
23.01.2013, 18:40 #4
a[0][0] это уже не указатель на первый элемент. а само значение. запись &a[0] = a - вы за счет индексации разименовали и опять же получили адрес. Хочу сказать, что индексирование это по сути то же самое, что и разименование.
MickeyBlueEyes
Студент
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
23.01.2013, 18:59 #5
&a[0][0] - адресс первого елемента массива.
a[0] - это адресс начала a[0][0]
Shepard90
5 / 5 / 0
Регистрация: 18.10.2010
Сообщений: 140
23.01.2013, 19:07 #6
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
&a[0][0] - адресс первого елемента массива.
a[0] - это адресс начала a[0][0]
??? &a[0][0] и a[0] это одно и то же. накидайте небольшой код и посмотрите результат обоих вариантов применения операторов к массиву - в выоде будет один и тот же адрес
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.01.2013, 19:08  [ТС] #7
Цитата Сообщение от MickeyBlueEyes Посмотреть сообщение
&a[0][0] - адресс первого елемента массива.
a[0] - это адресс начала a[0][0]
Что значит a[0] - это адресс начала a[0][0] ?

И что такое a и *a ?
Shepard90
5 / 5 / 0
Регистрация: 18.10.2010
Сообщений: 140
23.01.2013, 19:10 #8
Цитата Сообщение от Shepard90 Посмотреть сообщение
??? &a[0][0] и a[0] это одно и то же. накидайте небольшой код и посмотрите результат обоих вариантов применения операторов к массиву - в выоде будет один и тот же адрес
MickeyBlueEyes, хотя ваши слова вроде как не противоречат этому
MickeyBlueEyes
Студент
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
23.01.2013, 19:24 #9
Цитата Сообщение от fuelcs Посмотреть сообщение
Что значит a[0] - это адресс начала a[0][0] ?
Да, если написать так *a[0], то с адресса a[0] вытянется значения a[0][0], если так *(a[0] + 1), то значение из a[0][1].

Цитата Сообщение от fuelcs Посмотреть сообщение
И что такое a и *a ?
Одно и тоже, это адресс a[0][0];

Цитата Сообщение от Shepard90 Посмотреть сообщение
MickeyBlueEyes, хотя ваши слова вроде как не противоречат этому
Ну да)
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.01.2013, 19:27  [ТС] #10
Цитата Сообщение от Shepard90 Посмотреть сообщение
??? &a[0][0] и a[0] это одно и то же. накидайте небольшой код и посмотрите результат обоих вариантов применения операторов к массиву - в выоде будет один и тот же адрес
C++
1
2
3
4
for (int i=0;i<n;i++)
{
    cout << &a[i] << "\n";
}
выводит адрес первого элемента каждой строки
MickeyBlueEyes
Студент
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
23.01.2013, 19:35 #11
Кстати сам суть вопроса в силе:
C++
1
func(a,n);
Ну на сколько я понял, это контролирует уже сам компилятор, в ф-ции ожидается что будет передаватся указатель на указатели, а передаётся массив, но вообще банально в стек ложится адресс начала массива вроде так да.
Если ф-цию вызывать так:
C++
1
func(a,n)
То компилятор походу понимает это как передача массива в ф-цию и происходит ошибка, а хотя это адресс начала массива ф-ции.
Если параметр обьявить как
C++
1
void func(int a[][10]){}
То ошибки не будет, первую скобку можна опустить, но размер второй ячейки должен соответсовать, что затрудняет работу, поэтому обычно передают указатель на указатели.
Shepard90
5 / 5 / 0
Регистрация: 18.10.2010
Сообщений: 140
23.01.2013, 20:04 #12
Цитата Сообщение от fuelcs Посмотреть сообщение
for (int i=0;i<n;i++)
{
cout << &a[i] << "\n";
}
выводит адрес первого элемента каждой строки
Вернее первого столбца

Добавлено через 9 минут
Цитата Сообщение от Shepard90 Посмотреть сообщение
Цитата Сообщение от fuelcs Посмотреть сообщение
for (int i=0;i<n;i++)
{
cout << &a[i] << "\n";
}
выводит адрес первого элемента каждой строки
Вернее первого столбца
Ой извиняюсь. Адреса элементов первого столбца. Очитался все верно

Добавлено через 3 минуты
fuelcs, а зачем вы пользуте статические массивы? Если уж вам и необходимо применять указатели, разименования и пр., то юзали бы динамические - намного понятнее и универсальнее, чем использовать статические вкупе с указателями.

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
int N,M;
cin>>N;
cin>>M;
int ** Matrix=new int*[N];//создаем указатель на массив указателей
for(int i=0;i<N;i++){
    Matrix[i]=new int[M];//каждому указателю массива Matrix[i] присваиваем массив чисел
    for(int j=0;j<M;j++)
        Matrix[i][j]=0;
}
f(Matrix,N,M)
delete [] Matrix; //не забываем высвобождать выделенную память
C++
1
void f(int ** a, int n, int m){}
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.01.2013, 20:09  [ТС] #13
Я только разбираюсь с указателями, пока с динамическими массивами не умею работать.

По сути, я хотел передать в функцию массив через указатели.

Подскажите, я правильно понимаю суть:
двухмерный массив это структура которая состоит из одномерных массивов, на первый элемент которых указывает массив указателей, и в свою очередь на первый указатель массива указывает указатель?

На примере:
а - указатель на первый указатель массива указателей
*а - адрес первого указателя из массива.

Если так, то как мне передать в функцию тот указатель?
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
26.01.2013, 18:48  [ТС] #14
Получилось так:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void func (int** c, int m, int n)
{
    for (int i=0;i<m;i++)
    {
        for (int j=0;j<n;j++)
        {
            cout << setw(3) << *(*(c+i)+j);
        }
        cout << "\n";
    }
}
 
int main()
{
    const int m=4;
    const int n=5;
    int a [m][n]={0};
    int* b[m];
    
    for (int i=0;i<m;i++)
    {
        //b[i]=a[i];        Вариант 1
        //b[i]=&a[i][0];    Вариант 2
        b[i]=*(a+i);//      Вариант 3
    }
 
    int** c=&b[0];
 
    for (int i=0;i<m;i++)
    {
        for (int j=0;j<n;j++)
        {
            a[i][j]=i*n+j+1;
            cout << setw(3) << a[i][j];
        }
        cout << "\n";
    }
 
    cout << "\n";
 
    func(c,m,n);
 
    return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,231
Записей в блоге: 3
Завершенные тесты: 1
26.01.2013, 20:55 #15
C++
1
2
3
4
5
6
7
8
template<typename T,int N,int M>
void foo(T (&arr)[N][M]){
    
}
int main(){
    int arr[12][30];
    foo(arr);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2013, 20:55
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Константные указатели и указатели на константу - C++
Чем они, собственно говоря, отличаются? Поясните, пожалуйста. Не знаю, как так получилось, что в разных источниках - разные...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.01.2013, 20:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru