Перейти к содержимому

Фотография

Новые уроки по С++. Урок 8. Указатели

автор денис марков

Сообщений в теме: 12

#1 DenisMD

DenisMD

    Продвинутый пользователь

  • Модераторы
  • 40 сообщений
  • ГородМагнитогорск

Отправлено 16 Июль 2013 - 01:43

Научимся работать с адресами переменных


  • Evgeniy это нравится

#2 Frenzy

Frenzy

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 20 Август 2013 - 14:36

Всем привет. У меня еще один вопрос: можно ли объявлять указатель типа auto или лучше создавать указатель с таким же типом как и переменная на которую он указывает?



#3 DenisMD

DenisMD

    Продвинутый пользователь

  • Модераторы
  • 40 сообщений
  • ГородМагнитогорск

Отправлено 21 Август 2013 - 13:11

Всем привет. У меня еще один вопрос: можно ли объявлять указатель типа auto или лучше создавать указатель с таким же типом как и переменная на которую он указывает?

В целом если известно на какой тип указывает указатель - безопаснее создавать указатель такого же типа. Но если не известен тип указателя можно использовать void *p; он может ссылаться на любой тип данных. Правда есть и ограничение: арифметика указателя работать не будет,так как прибавить 1 к такому указателю не определено, так как не известно на сколько байт нужно сдвигать указатель


  • Administrator это нравится

#4 Frenzy

Frenzy

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 23 Август 2013 - 14:37

 

Всем привет. У меня еще один вопрос: можно ли объявлять указатель типа auto или лучше создавать указатель с таким же типом как и переменная на которую он указывает?

В целом если известно на какой тип указывает указатель - безопаснее создавать указатель такого же типа. Но если не известен тип указателя можно использовать void *p; он может ссылаться на любой тип данных. Правда есть и ограничение: арифметика указателя работать не будет,так как прибавить 1 к такому указателю не определено, так как не известно на сколько байт нужно сдвигать указатель

Спасибо за ответ. Надеюсь не надоел с вопросами)



#5 draobrehtom

draobrehtom

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 18 Декабрь 2013 - 17:32

Привет. Объяснишь, пожалуйста, подробнее?
 

int **p = new int*[N];
for(int i(0); i < N; i++)
p[i] = new int[M];

 

 
Не могу понять часть кода.


#6 Administrator

Administrator

    Администратор

  • Администраторы
  • 89 сообщений
  • ГородПенза

Отправлено 03 Январь 2014 - 23:57

 

Привет. Объяснишь, пожалуйста, подробнее?
 

int **p = new int*[N];
for(int i(0); i < N; i++)
p[i] = new int[M];

 

 
Не могу понять часть кода.

 

в этой части int **p = new int*[N]; вы создаете указатель на указатели, а этим указателям выделяете также динамически память, подробней можете глянуть у меня в уроке        http://www.youtube.c...h?v=A6KCdZbLVZo



#7 Classic

Classic

    Новичок

  • Пользователи
  • Pip
  • 3 сообщений

Отправлено 27 Февраль 2014 - 16:18

здравствуйте.

объясните пожалуста синтаксис: я так понял суть квадратных скобок следущая:

q[i] = q+i,

тогда почему в случае с указателями

q[i] = *(q+i)

т е произойдет вывод значения а не адреса (для массивов)



#8 VRoman27

VRoman27

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 18 Июнь 2014 - 23:23

Напомнило производную и первообразную)



#9 ernist

ernist

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 21 Июнь 2014 - 18:54

отличный урок спасибо. Вопрос такой: на 46:50 минуте про динамическое выделение размера массива, почему нельзя создать простым способом? из за адресных пространств нельзя?

 

p.s не судите строго, я только изучаю C++  



#10 Adam1983

Adam1983

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 25 Декабрь 2014 - 12:41

Добрый день! Не могу понять ошибку в своём домашнем задании, судя по всему должно всё работать, но в итоге матрица считается некорректно. Проверял по частям, матрицы заполняются верно, третья матрица обнуляется, код по умножению матрицы сходится с кодом в ответе на уроке 9..

А в итоге выдаёт какой то мусор. Куда можно выложить мой недокод для проверки, может кто то сможет помочь? (заранее извеняюсь за стиль написания, я новичёк и поэтому далёк от совершенства).



#11 Adam1983

Adam1983

    Новичок

  • Пользователи
  • Pip
  • 2 сообщений

Отправлено 26 Декабрь 2014 - 11:26

#include <iostream>
#include <conio.h>
#include <windows.h>



using namespace std;



int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);

 int N1;
 int H1;

 cout << "Введите колличество столбцов первой матрицы: ";
 cin >> N1;

 cout << "Введите колличество строк первой матрицы: ";
 cin >> H1;

  int **p = new int* [N1];
 
  for (int i(0); i<N1;i++)
   p[i] = new int [H1];

cout << "Заполните первую матрицу: "<< endl;

    for (int i(0); i<N1;i++)
     {for (int j(0); j<H1;j++)
      { if(!(cin>>p[i][j]))
       {cout << "Вы ввели недопустимый символ!!";
        _getch();
       return -1;
    
       }
       
     }}



 int N2=H1;
 int H2;

 cout << "Введите колличество строк второй матрицы: ";
 cin >> H2;

 

  int **q = new int* [N2];
 
  for (int i(0); i<N2;i++)
   q[i] = new int [H2];

cout << "Заполните вторую матрицу (кол-во столбцов совпадает с кол-вом столбцов первой матрицы: "<< endl;

    for (int i(0); i<N2;i++)
     {for (int j(0); j<H2;j++)
      { if(!(cin>>q[i][j]))
       {cout << "Вы ввели недопустимый символ!!";
        _getch();
       return -1;
    
       }
       
     }}






 int N3=N1;
 int H3=H2;


 int **g = new int* [N3];
 
  for (int i(0); i<N3;i++)
   g[i] = new int [H3];

//обнуляем третью матрицу

 for(int i=0; i<N3; i++)
 {
  for(int j=0; j<H3; j++)
   g[i][j]=0;}


 


cout << "Первая матрица умноженная на вторую будет равняться: " <<endl;


   

for(int i=0; i<N3; i++)
 {
  for(int j=0; j<H3; j++)
   {
    for(int z=0; z<H2; z++)
    {
     g[i][j]+= p[i][z]*q[z][j];
     
    }
   }
 
 }

for(int i=0; i<N3; i++)
 {
  for(int j=0; j<H3; j++)
   {
    cout << g[i][j] <<" ";
   }
   cout <<endl;
  }  

   
  for (int i(0); i<N1;i++)
  delete [] p[i];

 delete [] p;
 
   


  for (int i(0); i<N2;i++)
  delete [] q[i];

 delete [] q;


 
 for (int i(0); i<N3;i++)
  delete [] g[i];

 delete [] g;

 
 _getch();
 return 0;
}
 



#12 yolar

yolar

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 29 Май 2016 - 20:54

Подскажите, пожалуйста ошибки.
Когда ввожу размеры матрицы выдает ошибку в выделенном блоке и подчеркнутой строке. Иногда рассчитывает, но рассчитывает неправильно. Помогите, пожалуйста, часов 5 проверял, ошибок не увидел...

#include <iostream>
#include <cstring>
#include <conio.h>
#include <cctype>
 
using namespace std;
 
int main()
{
setlocale(0, "rus");
int N1(0), N2(0), M1(0), M2(0);
int N3(0), M3(0);
 
cout << "Матрица 1: ";
cin >> N1 >> M1;
cout << "Матрица 2: ";
cin >> N2 >> M2;
if (N1 < N2)
N3 = N1;
else N3 = N2;
if (M1 < M2)
M3 = M1;
else M3 = M2;
if (N1 != M2)
{
cout << "Ошибка: Для рассчета, кол-во столбцов первой матрицы должно равнятся кол-ву строк второй!!!";
_getch();
return -1;
}
/*,,,,,,,,,,,,СОЗДАНИЕ МАССИВОВ для МАТРИЦ,,,,,,,,,,,,.*/
////Создание массива 1////
int **p1 = new int *[N1];
for (int i(0); i < N1; i++)
p1[i] = new int[M1];
 
////Создание массива 2////
int **p2 = new int *[N2];
for (int i(0); i < N2; i++)
p2[i] = new int[M2];
 
////Создание массива 3////
int **p3 = new int *[N3];
for (int i(0); i < N3; i++)
p3[i] = new int[M3];
 
system("cls");
/*,,,,,,,,,,,,,,,ВВОД МАТРИЦ,,,,,,,,,,,,,,,*/
////Ввод матрицы 1////
cout << "M1:" << endl;
for (int i(0); i < N1; i++)
for (int j(0); j < M1; j++)
{
cout << "M1[" << i << "][" << j << "]=";
cin >> p1[i][j];
}
system("cls");
 
////Ввод матрицы 2////
cout << "M2:" << endl;
for (int i(0); i < N2; i++)
for (int j(0); j < M2; j++)
{
cout << "M2[" << i << "][" << j << "]=";
cin >> p2[i][j];
}
system("cls");
/*,,,,,,,,,,РАССЧЕТ МАТРИЦЫ №3,,,,,,,,,,,,,,,*/
////Обнуление матрицы 3////
for (int i(0); i < N3; i++)
for (int j(0); j < M3; j++)
p3[i][j] = 0;
////Рассчет матрицы 3////
for (int i(0); i < N3; i++)
for (int j(0); j < M3; j++)
for(int k(0); k < N1; k++)
p3[i][j] += p1[i][k] * p2[k][j];
 
/*,,,,,,,,,,,,,ВЫВОД МАТРИЦ,,,,,,,,,,,,,,,,,,*/
////Вывод матрицы 1////
cout << "Матрица 1\n";
for (int i(0); i < N1; i++)
{
for (int j(0); j < M1; j++)
{
cout << p1[i][j] << " ";
}
cout << endl;
}
////Вывод матрицы 2////
cout << "\nМатрица 2\n";
for (int i(0); i < N2; i++)
{
for (int j(0); j < M2; j++)
{
cout << p2[i][j] << " ";
}
cout << endl;
}
////Вывод матрицы 3////
cout << "\nМатрица 3\n";
for (int i(0); i < N3; i++)
{
for (int j(0); j < M3; j++)
{
cout << p3[i][j] << " ";
}
cout << endl;
}
 
 
_getch();
return 0;
}


#13 ДимаКА

ДимаКА

    Новичок

  • Пользователи
  • Pip
  • 1 сообщений

Отправлено 18 Июль 2017 - 16:04

Привет всем. помогите найти ошибку. скопировал код из 8 урока по с++ ,но получил того ,чего ожидалось. Вот код.
#include
#include
#include
#include

using std::cout;
using std::cin;
using std::endl;

int main()
{
setlocale (LC_ALL, "Russian");

double m1[3][3];
double m2[3][3];
double m3[3][3];

cout <<"заполните матрицу 1 3х3:\n";
for (int i(0);i<3;i++)
{
for(int j(0); j<3; j++)
{
cin >>m1[i][j];
m3[i][j]=0;//обнуляем матрицу
}
}
system ("cls");

cout <<"заполните матрицу 2 3х3:\n";
for (int i(0);i<3;i++)
{
for(int j(0); j<3; j++)
{
cin >>m2[i][j];

}
}
system ("cls");

for (int i=0; i<3; i++)
{
for (j=0; j<3; j++)
{
for(int m=0; m<3;m++)
{
m3[i][j]+= m1[i][m]*m2[m][j];
}
}
}
for (int i(0); i<3; i++)
{
cout <<"| ";
for (int j(0);j<3; j++)
{
cout<





Темы с аналогичным тегами автор денис марков