Другие языки программирования и технологии

Привет народ. вопрос по языку С++, конкретнее про указатели и их присваивание

#include <stdio.h>

int main()

{

int n = 5;

double x;

int * p1 = &n;

double * pd = &x;

x = n;

pd = p1;

return 0;

}

когда расширения этого файла .с ошибку не видит, когда .cpp видит ошибку с текстом
cannot convert from 'int *' to 'double *
Кто нибудь может объяснить почему так происходит, или ссылку на ресурс какой нибудь, а то в Google искал, только написано что указатели одного типа можно присвоить и все
Шанг Цунг
Шанг Цунг
377
pd = p1; // так нельзя, указатели имеют разный тип
pd = (double)p1; // и так тоже нельзя) )
pd = (double*)p1; // так можно
Ербол Кульмухамбетов
Ербол Кульмухамбетов
74 495
Лучший ответ
87 87 А звездочка после типа указывается только, если преобразовывается указатель?
Можно сделать вот так:
pd = (double*) p1;

но так как содержимое переменной при таком преобразовании не будет изменяться, то оно будет выглядеть с точки зрения другого типа как мусор. Особенно если учесть, что double имеет 8 байт, а int 4 (заденет 4 лишние байта за пределами переменной x, а что там будет - одному лишь компилятору известно).
Про100 Руся=__=
Про100 Руся=__=
51 782
p1 указывает на адрес n
pd указывает на адрес d
x=n - присвоение значения с неявным преобразованием из int в double
pd=p1 - попытка переназначить указатель на другой адрес.
А так-как тип double и тип int в памяти занимают разное количество байт, то это может привести к очень нежелательным последствиям. Поэтому, если очень надо, чтобы указатель типа double указывал на область памяти типа int, то нужно явное приведение типов, т. е. писать что-то вроде pd=(double *)p1

По запросу "c++ работа с указателями" можно много интересного нагуглить
Все правильно в с++ приведите типы pd = (double *)p1; - и все будет хорошо
Сашка Мисько
Сашка Мисько
35 594
Попробуйте добавить к n и p1 приставку (double).

x = (double)n;

pd = (double)p1;
TH
Tevos Hovsepyan
22 076
http://msdn.microsoft.com/ru-ru/library/system.double(v=vs.110).aspx int это integer.т. е целые числа
Игорь Ашмаров
Игорь Ашмаров
14 180
я не знаю автоматически ли распознаёт твой компилятор расширения, но как бы .c это должно восприниматься на компиляцию как программа на языке Си, а , .cpp как программа на языке С++.

Вполне возможно, очень много про это читал, что С++ более жёстко относится к типам и приведениям типов, возможно такой код, а он корректен и для Си и для С++ по идее, языком Си воспринимается нормально и тихо мирно преобразование делает сам, что не сказать о С++. Вам нужно почитать сам стандарт о явном и не явно приведении типов для указателей и как с этим делом работает ваш компилятор