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

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

Войти
Регистрация
Восстановить пароль
 
 
bigibug
0 / 0 / 0
Регистрация: 03.04.2014
Сообщений: 3
#1

Загадка указателей - C++

03.04.2014, 23:06. Просмотров 653. Ответов 20
Метки нет (Все метки)

Здравствуйте =) Привел меня к Вам следующий вопрос.
Поступило задание составить программу для решения квадратного уровнения, используя указатели.
В процессе работы наткнулся на то что, казалось бы, одно и тоже (по смыслу) выдает разные результаты.
Преподаватель работу принял, но разницу не смог обьяснить. А я теперь ночами спать не могу, понять хочу что не так сделал. =) Единственная разница выделена жирным шрифтом.
Подскажите, пожалуйста, почему 2 следующие программы выдают столь различные результаты?
Листинг 1
Кликните здесь для просмотра всего текста
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
]#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int *p=new int[3],i,j=0;
    double x1,x2,d;
    char *t="abc";
    char *q=t;
    while (*q) 
    {
    cout<<*q++<<"=";
   [B] cin>>*(p+j);j++;[/B]
    for (i=0;i<3;i++) cout<<*(p+i)<<endl;     
    }
    d=pow(p[1],2)-4*p[0]*p[2];
    cout<<"d="<<d<<endl;
    if (d>=0) {x1=(-p[1]+sqrt(d))/2*(p[0]);
               x2=(-p[1]-sqrt(d))/2*(p[0]);
               cout<<"x1="<<x1<<endl<<"x2="<<x2;
        }
    else cout<<"net corney";
    delete [] p;
}

Результат 1
Кликните здесь для просмотра всего текста

a=1
1
0
0
b=5
1
5
0
c=4
1
5
4
d=9
x1=-1
x2=-4

Листинг 2
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int *p=new int[3],i,j=0;
    double x1,x2,d;
    char *t="abc";
    char *q=t;
    while (*q) 
    {
    cout<<*q++<<"=";
   [B] cin>>*p++;[/B]
    for (i=0;i<3;i++) cout<<*(p+i)<<endl;     
    }
    d=pow(p[1],2)-4*p[0]*p[2];
    cout<<"d="<<d<<endl;
    if (d>=0) {x1=(-p[1]+sqrt(d))/2*(p[0]);
               x2=(-p[1]-sqrt(d))/2*(p[0]);
               cout<<"x1="<<x1<<endl<<"x2="<<x2;
        }
    else cout<<"net corney";
    delete [] p;
}

Результат 2
Кликните здесь для просмотра всего текста

a=1
0
0
1035
b=5
0
1035
892547121
c=4
1035
892547121
842086196
d=6ю53828e+17
x1=1.72275e+10
x2=-8.1967e+11
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2014, 23:06     Загадка указателей
Посмотрите здесь:

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей - C++
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе написания, но уже наверное есть ошибки....

Массив указателей на массив строк и сортировка массива указателей - C++
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до тех пор, пока не будет заполнен массив...

Загадка - C++
Здравствуйте помогите в отгадывании загадки, нужно реализовать поиск по таблице чисел и букв У меня есть набор чисел и вбивая их...

Загадка Эйнштейна о зебре - C++
Зебра. В трех соседних домах, окрашенных в разные цвета, живут пять человек разных национальностей. У каждого из них есть своё любимое...

Загадка преобразования IntToHex - C++
Есть переменная int в ней содержится значение в десятичной форме -39 пользуясь функцией IntToHex, получаю на выходе FFFFFFDB. Теперь...

Загадка с перестановкой цифр в числе - C++
Доброго времени суток! В С++ недавно, но в универе уже задали такие задачи: 1)В трёхзначном числе x зачеркнули его последнюю цифру....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 19:10     Загадка указателей
Еще ссылки по теме:

очень интересная загадка по мотивам одной известной истории=) - C++
Вы, наверное, слышали историю о том, как один могуществен-ный правитель обещал наградить ученого, оказавшего ему большую услугу. Ученый,...

Загадка: Что делает функция? Тернарная система исчисления и логика - C++
Что делает функция: std::string f(unsigned int x) { std::string r=&quot;&quot;; char digits={'-', '0', '+'}; int d; int ...

Инициализация указателей - C++
Добрый вечер, объясните пожалуйста, что значит присвоение начальных значений указателям, как например в данном случае: float *fPtr =...

Массивы указателей - C++
#include &quot;stdafx.h&quot; #include &quot;stdlib.h&quot; #include &quot;locale.h&quot; #include &quot;stdio.h&quot; void p1(float &amp;); void p2(float &amp;); void...


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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6442 / 3081 / 306
Регистрация: 04.12.2011
Сообщений: 8,482
Записей в блоге: 4
04.04.2014, 19:10     Загадка указателей #21
Цитата Сообщение от intern Посмотреть сообщение
Ведь arr и parr - адреса 0-го элемента в arr[].
А вопрос - почему не работает 1-й вариант?
Имя массива это имя переменной которая приводится к типу указателя на первый элемент. Можно считать, грубо говоря, что к типу T *const ptr. Его нельзя изменить. То есть имя массива arr_T:
T *ptr = arr_T;
возвращает значение rvalue типа указатель, как результат неявного преобразования. Это адрес, но адреса у него нет.j Поэтому для итерации и создают отдельный указатель, установив его на адрес первого элемента, используя имя массива.(фразочка...)
Указатели компактны, но говорить о них компактно не выходит.
Yandex
Объявления
04.04.2014, 19:10     Загадка указателей
Ответ Создать тему
Опции темы

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