Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
#1

Ссылки - C++

30.11.2010, 15:07. Просмотров 356. Ответов 5
Метки нет (Все метки)

Здравствуйте.
Если я задаю матрицу
C++
1
2
3
int **m=new int*[h];
for (int i=0;i<h;i++)
    m[i]=new int[h];
то могу ли я обращаться и производить действия с её столбцами (например, сравнивать на идентичность) через *m[h] (или m*[h] / &m[h] )?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.11.2010, 15:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ссылки (C++):

Зачем нужны rvalue ссылки, если есть универсальные ссылки - C++
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue ссылками. Я не пойму, зачем нужны rvalue ссылки, если есть...

Ссылки - C++
Хотел бы узнать как функция Struk &amp; Function() возвращает значения например что бы код весь не писать скажу что объявлен класс struk...

ссылки - C++
скиньте плиз несколько интерестных ссылок типа таких: http://www.firststeps.ru/mfc/winapi/winapi1.html уроки, примеры Добавлено...

Ссылки - C++
Hi all Нельзя возвращать ссылку, если возвращаемое значение является локальной переменоой как здесь, потому что локальные переменные...

Ссылки в С++ - C++
void swap(int&amp; i, int&amp; j) { int tmp = i; i = j; j = tmp; } int main() { int x, y;

ссылки - C++
как здесь привести к интовому виду,чтобы выдавало 100? # include &lt;iostream&gt; using namespace std; void f(int &amp;i) { i = 100;...

5
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2010, 15:12 #2
Цитата Сообщение от 4ance Посмотреть сообщение
то могу ли я обращаться и производить действия с её столбцами
А со строками можете?
0
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
30.11.2010, 15:37  [ТС] #3
Цитата Сообщение от fasked Посмотреть сообщение
А со строками можете?
Ну если со столбцами не могу, то со строками та же история.
Если я создаю матрицу
C++
1
int **m=new int*[h];
**m - создаётся переменная в которой хранится массив массивов int *[h].
Потом в цикле
C++
1
2
for (int i=0;i<h;i++)
    m[i]=new int[h];
указывается количество массивов(внешних) для переменной *m[i].

То есть, если я хочу сравнить столбцы(это уже внутренние массивы - m[i]), то
if ( *m[ i ] == *m[ i + 1 ]) {...}.

Правильно ли это?
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2010, 16:43 #4
Цитата Сообщение от 4ance Посмотреть сообщение
Правильно ли это?
Нет, неправильно.
Вы немного не понимаете суть массивов в Си. Как такового объекта "массив" в языке не существует. Есть область памяти, в которую последовательно записаны данные одного типа.

То есть массив вида int array[5] - это участок памяти размером 5 * sizeof(int). Это просто область памяти и ничего больше. Следовательно абсолютно неважно каким типом данных ее представлять. То есть я могу создать массив из 5 объектов типа int, а считать из него 20 объектов типа char (при условии что sizeof(int) == 4) && sizeof(char) == 1);

Ну а так как объекта массив не существует, то и сравнивать их нельзя. То есть нельзя писать:
C
1
2
3
4
5
int a[5];
int b[5];
// ...
if(a == b)
//...
Для работы с массивами в языке существуют указатели. Когда массив передается в функцию, то фактически в функцию передается указатель на массив, а если быть еще более точным то указатель на первый элемент массива.
При выделении области памяти динамически (new, malloc, realloc) указателю также присваивается адрес первого элемента массива.

Теперь обогатившись некоторыми знаниями посмотрим на конкретный код, то есть Ваш и то что Вы хотели бы с ним сделать.

C++
1
2
3
int **m=new int*[h]; 
for (int i=0;i<h;i++)
 m[i]=new int[h];
Здесь int **m - это двойной указатель (или указатель на указатель), с помощью операции new int*[h] этому указателю присваивается адрес первого элемента из массива указателей.
далее в цикле, каждому элементу из массива указателей присваивается адрес первой переменной из массива типа int.

Тогда получается, что выражение *m[ i ] == *m[ i + 1 ] будет аналогично выражению m[i][0] == m[i + 1][0]. То есть сравниваться будут только первые элементы i-ой и следующей строки.

Вывод: Сравнивать строки и столбцы надо поэлементно в цикле.
C++
1
2
3
4
5
6
7
bool eq = true;
for(int j = 0; j < h; ++j) {
     if(m[i][j] != m[i+1][j]) {
           eq = false;
           break;
     }
}
1
4ance
1 / 1 / 0
Регистрация: 02.11.2010
Сообщений: 78
30.11.2010, 19:46  [ТС] #5
Цитата Сообщение от fasked Посмотреть сообщение
Нет, неправильно.
Вывод: Сравнивать строки и столбцы надо поэлементно в цикле.
C++
1
2
3
4
5
6
7
bool eq = true;
for(int j = 0; j < h; ++j) {
     if(m[i][j] != m[i+1][j]) {
           eq = false;
           break;
     }
}
Спасибо, за лекцию!
Всё-таки, придётся добавлять лишний цикл. А то и 2.

Добавлено через 2 часа 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int matrix[4][4] = { 
{1, 2, 1, 1},
{1, 2, 2, 2},
{1, 2, 3, 3},
{1, 2, 4, 4}
};
 
int main () {
    for ( j = 0; j < 4; j++ ) //Внешний цикл - проход по столбцам
    {
        for ( i = 0; i < 4; i++ ) // Проход по строкам
        {
            if ( matrix[ i ][ j ] == matrix[ i ][ j + 1 ] ) 
            {
                cout << matrix[ i ][ j ] << " ";    
            }
                else break;
        }   
    }
    return 0;
}
Выдаёт 1 2 3 4 1.
На дебаге первую единицу видит при j==2, хотя во втором столбце одни двойки!

Добавлено через 17 минут
Нет, первая единица правильная.
Последнюю единицу записывает потому что matrix[0][3] == matrix[0][0].
0
fasked
Эксперт С++
4948 / 2528 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
30.11.2010, 19:54 #6
Цитата Сообщение от 4ance Посмотреть сообщение
matrix[ i ][ j ] == matrix[ i ][ j + 1 ]
В этой строке выход за пределы массива, когда счетчик достигнет максимума, то есть когда j = 3.
Условие в цикле должно быть
C++
1
for(int j = 0; j < 4 -1; ++j)
1
30.11.2010, 19:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2010, 19:54
Привет! Вот еще темы с ответами:

Ссылки - C++
Для меня вроде понятно что означает конструкция int* a; создается указатель на целую переменную. А что означает конструкция int&amp;...

Возврат ссылки - C++
int &amp; function(int); Понятно для чего передают аргументы в функцию как указатели или ссылки.Но зачем функция возвращает ссылку? Чтобы...

Указатели и ссылки - C++
Экспериментируя с указателями пришел к вот таким выводам: int a; //переменная int *b; //указатель int &amp;c = a //ссылка на &lt;a&gt; ...

Указатели и ссылки - C++
Допустим, что есть функция, в которую мы кидаем массив по указателю и кол-ву элементов. void printArray(int *arr, int elements) ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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