Однострочные операции с указателями - PullRequest
1 голос
/ 11 февраля 2011

Я боролся с проблемой домашнего задания в C ++.

проблема заключается в следующем:

Напишите одно утверждение, которое выполняет каждую из следующих задач. Предположим, что num1 является переменной с плавающей точкой. Предположим также, что ar1 [100] и ar2 [100] являются массивами типа char:

  1. Объявить ptr как указатель на объект типа double
  2. Назначить адрес переменной num1 для ptr.
  3. Показать значение объекта, на который указывает ptr.
  4. Назначить значение объекта, на которое указывает ptr, переменной num1.
  5. Показать адрес num1.
  6. Скопируйте строку из ar1 в ar2.

моя проблема с номером 2. проблема в том, что указатель является двойным, а переменная num1 является плавающей точкой.

моя другая проблема в том, что я не вижу, как 6 можно сделать без использования цикла for.

до сих пор я получил это:

  1. double * ptr = new double;
  2. ptr = (double *) & num1;
  3. cout << * ptr; </li>
  4. num1 = * ptr;
  5. cout << & num1; </li>
  6. // не знаю

это дает мне странные значения, если все сделано, но если я объявляю num1 как double и меняю 2 на ptr = & num1, все работает нормально.

Пожалуйста, помогите Я был на этой проблеме в течение двух дней.

Ответы [ 6 ]

2 голосов
/ 11 февраля 2011

Для задачи:

Назначить адрес переменной float num1 на double* ptr.

Вы уверены, что должны назначить адрес, а не значение? Присвоение адреса переменной указателю совершенно другого типа не имеет смысла.

Вы также должны знать, что если вы используете C++, как говорит ваш тег, вы должны предпочесть использование приведения в стиле C++ (reinterpret_cast<type>(variable) и т. Д.) Для использования приведений в стиле C.

2 голосов
/ 11 февраля 2011

double и float оба являются типами с плавающей точкой.Так что, если ваш учитель сказал, что num1 - это «тип с плавающей запятой», вы должны уметь использовать double.Если ваш учитель сказал использовать float, то вы застряли.

6 просит вас сделать что-то очень конкретное.Это будет включать в себя поиск в Google, но это может быть сделано как 1-лайнер.

1 голос
/ 11 февраля 2011

См., double - это плавающая точка двойной точности (двоичная64) IEEE 754 , в то время как float - это плавающая точка одинарной точности (двоичная32), определяемая тем же стандартом.1006 * Итак, просто объявите num1 как double.

1 голос
/ 11 февраля 2011

A double - это значение с плавающей запятой, поэтому ptr = &num1 должно быть в порядке. С другой стороны, double *ptr = new double; не только объявляет указатель на double, но и инициализирует его. double* ptr достаточно в качестве декларации;

Приведение float* к double*, скорее всего, не даст ничего полезного, потому что float и double, вероятно, имеют несовместимые представления (в частности, они обычно имеют разный размер).

0 голосов
/ 11 февраля 2011

все кажется правильным. за исключением номера 1. Я бы сказал: double * ptr; Он не говорит, чтобы создать его, вы создаете утечку памяти.

6 - это strcpy_s (arr2, arr1);

0 голосов
/ 11 февраля 2011

Для 6:

string.h: strcpy(), strncpy() и strlcpy() - Google их.

...