#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 искал, только написано что указатели одного типа можно присвоить и все
Другие языки программирования и технологии
Привет народ. вопрос по языку С++, конкретнее про указатели и их присваивание
pd = p1; // так нельзя, указатели имеют разный тип
pd = (double)p1; // и так тоже нельзя) )
pd = (double*)p1; // так можно
pd = (double)p1; // и так тоже нельзя) )
pd = (double*)p1; // так можно
87 87
А звездочка после типа указывается только, если преобразовывается указатель?
Можно сделать вот так:
pd = (double*) p1;
но так как содержимое переменной при таком преобразовании не будет изменяться, то оно будет выглядеть с точки зрения другого типа как мусор. Особенно если учесть, что double имеет 8 байт, а int 4 (заденет 4 лишние байта за пределами переменной x, а что там будет - одному лишь компилятору известно).
pd = (double*) p1;
но так как содержимое переменной при таком преобразовании не будет изменяться, то оно будет выглядеть с точки зрения другого типа как мусор. Особенно если учесть, что double имеет 8 байт, а int 4 (заденет 4 лишние байта за пределами переменной x, а что там будет - одному лишь компилятору известно).
p1 указывает на адрес n
pd указывает на адрес d
x=n - присвоение значения с неявным преобразованием из int в double
pd=p1 - попытка переназначить указатель на другой адрес.
А так-как тип double и тип int в памяти занимают разное количество байт, то это может привести к очень нежелательным последствиям. Поэтому, если очень надо, чтобы указатель типа double указывал на область памяти типа int, то нужно явное приведение типов, т. е. писать что-то вроде pd=(double *)p1
По запросу "c++ работа с указателями" можно много интересного нагуглить
pd указывает на адрес d
x=n - присвоение значения с неявным преобразованием из int в double
pd=p1 - попытка переназначить указатель на другой адрес.
А так-как тип double и тип int в памяти занимают разное количество байт, то это может привести к очень нежелательным последствиям. Поэтому, если очень надо, чтобы указатель типа double указывал на область памяти типа int, то нужно явное приведение типов, т. е. писать что-то вроде pd=(double *)p1
По запросу "c++ работа с указателями" можно много интересного нагуглить
Все правильно в с++ приведите типы pd = (double *)p1; - и все будет хорошо
Попробуйте добавить к n и p1 приставку (double).
x = (double)n;
pd = (double)p1;
x = (double)n;
pd = (double)p1;
http://msdn.microsoft.com/ru-ru/library/system.double(v=vs.110).aspx int это integer.т. е целые числа
я не знаю автоматически ли распознаёт твой компилятор расширения, но как бы .c это должно восприниматься на компиляцию как программа на языке Си, а , .cpp как программа на языке С++.
Вполне возможно, очень много про это читал, что С++ более жёстко относится к типам и приведениям типов, возможно такой код, а он корректен и для Си и для С++ по идее, языком Си воспринимается нормально и тихо мирно преобразование делает сам, что не сказать о С++. Вам нужно почитать сам стандарт о явном и не явно приведении типов для указателей и как с этим делом работает ваш компилятор
Вполне возможно, очень много про это читал, что С++ более жёстко относится к типам и приведениям типов, возможно такой код, а он корректен и для Си и для С++ по идее, языком Си воспринимается нормально и тихо мирно преобразование делает сам, что не сказать о С++. Вам нужно почитать сам стандарт о явном и не явно приведении типов для указателей и как с этим делом работает ваш компилятор
Похожие вопросы
- Вопрос по языку СИ, конкретнее по передачи байта по UART
- доброе утро программисти вопрос в нутри вопрос какой язык вибрать помогите кто чем сможеть
- Вопрос актуальности языка C++, расхождение источников. Мне нужна достоверная инфа на это счет.
- Вопрос о языках программирования
- Вопрос по языку программирования C# (СиШарп) (очень простой вопрос)
- Вопрос про языки программирования
- всем привет. народ скажите как записать образ диска. я уже про*бал 4 диск.
- Вопросы по языку СИ
- Вопрос по языку C#
- Вопрос про язык ассемблера