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

работа с указателями - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ поиск маршрута. Задача на С#. http://www.cyberforum.ru/cpp-beginners/thread33222.html
Задача следующая: Некая географическая карта местности задана квадратной сеткой определенного масштаба. В узлах сетки известна высота над уровнем моря. Между соседними узлами высота меняется плавно....
C++ Програма с .тхт файлом вот код #include <windows.h> #include <stdio.h> #include <conio.h> FILE *f; typedef struct tagINFO { http://www.cyberforum.ru/cpp-beginners/thread33219.html
C++ Обработка русского текста в консольном режиме.
Приветствую всех, Собственно вопрос: Создаю строковую переменную, посредством cin заношу в неё текст на русском, распечатываю cout'ом и получаю хлам. Типа ввоже йцукен, получаю ©жгЄҐ* В...
Курсач на С++(должен был сдать месяц назад!!(((() C++
1.Известно, что в Москве самыми теплыми являются дни с 15 июля по 15 августа. Для проведения фестиваля были выбраны 7 следующих подряд дней, наиболее теплых по данным за последние 10 лет. Составить...
C++ Автокорреляция http://www.cyberforum.ru/cpp-beginners/thread33208.html
Ув. форумчани напишите пожалуйста код на С++ Builder функцию автокорреляции или как по др. преобразование Фурье 2D.
C++ текстовый файл поскажите пожалуйста почему не работает. хочу написать первые символы строк если они удовлетворяют условию в конец того же файла из которого они считываются. if ((newfile = fopen(name, "a+")) !=... подробнее

Показать сообщение отдельно
CyBOSSeR
Эксперт C++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.05.2009, 09:24
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
#include <iostream>
 
const int n = 3;
const int m = 4;
 
using namespace std;
 
int main(int argc, char *argv[])
{
  int z[n][m]; // Имя любого массива (хоть двумерного, хоть 10-мерного) является указателем на первый элемент
 
  for(int i = 0; i < n; ++i)
    for(int j = 0; j < m; ++j)
      cin >> *(*(z + i) + j); //
  
 
  for (int i=0; i< n; i++)
  {
    for (int j=0; j < m; j++)
      cout << *(*(z + i) + j) << "\t";
    cout << endl;
  }
 
  system("PAUSE");
  return EXIT_SUCCESS;
}
Просто запомни что имя массива является указателем на первый элемент, следовательно ты можешь с именем массива обращаться как с указателем.
В случае с двумерным массивом он (массив) грубо говоря является массивом указателей на массивы чисел, т.е.
C++
1
2
3
4
5
int z[3][3] = {
  {1, 2, 3},
  {4, 5, 6},
  {7, 8, 9}
};
можно представить как:
z[1] указатель на {1, 2, 3}
z[2] указатель на {4, 5, 6}
z[3] указатель на {7, 8, 9}

Т.е. z[i] есть указатель на i-ую строку в массиве.

Когда ты пишешь z[i][j] идет обращений к j-му элементу i-ой строки.

Теперь давай разберемся с последовательностью выполнения такого вот оператора: *(*(z + i) + j) (который полностью эквивалентен оператору z[i][j])
1. z + i -получаем указатель типа int** на i-ую строку
2. *(z + i) - получаем строку (которая по сути является одномерным массивом), т.е. указатель типа int*
3. *(z + i) + j - получаем указатель на j-ый элемент i-ой строки, т.е. указатель типа int*
4. *(*(z + i) + j) - собственно получаем сам j-ый элемент i-ой строки, т.е. int.

И еще совет: не пользуйся типами short int, long double без необходимости, т.к. когда ты пишешь
C++
1
short int n = 4;
4 рассматривается как тип int, а следовательно компилятору приходится эту четверку преобразовывать к типу short int, везде где можно используй стандартный типы:
C++
1
bool, char, int, double
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru