关于C的指针

来源:百度知道 编辑:UC知道 时间:2024/06/13 01:20:41
下面一段程序:
#include <iostream>
using namespace std;

int main()
{
double dval=3.14;
double *cptr=&dval; //这里有些不明白
cout<<"dval="<<dval<<" , "<<"cptr="<<*cptr<<endl;
dval=5.28;
cout<<"dval="<<dval<<" , "<<"cptr="<<*cptr<<endl;

return 0;
}

而把指针定义的那一句分解成两句:
double *cptr;
*cptr=&dval;
这样就会编译错误,说“‘=’不能把double *转换为 double类型”
再把第二句改一下:
double *cptr;
cptr=&dval;
这程序就可以通过编译了。

请问这是为什么啊?有点晕。

*被称为“解引用操作符”
定义指针时表明紧跟后面的变量是一个指针;
其他情况下表示对该指针解引用,此时指指针指向的对象。
如:

double *cptr;
*cptr=&dval;
定义了一个double指针,名字叫cptr,编译错误因为上述第二种情况,*cptr此时对指针解引用是指指针指向的那个对象,但这个时候指针还没有初始化,也当然不可以把&dval赋值给它~~~~

double *cptr;
cptr=&dval;

这里,cptr已经是一个指针,当然可以进行赋值(把地址或其他指针赋给它)!

还有记住,不要对没有初始化的指针解引用!

double *cptr=&dval;//定义个double型指针,即一个指向double型数据的指针,并初始化.并不等于*cptr=&dval,而是cptr=&dval.&代表取址,cptr的值是dval的地址,使用时*cptr代表是dval的值.自己再好好看看书吧.

*cptr 是double 型的指针。是一个double型的变量。
而cptr为指针地址。eg:0xc0004000 为一地址。
&dval 也是地址。

编译错误就是告诉你不能将指针地址值 赋给double型的指针变量。

*cptr cptr两个不一样,指针用法和普通定义不一样,你仔细研究指针这一段

(1)
double *cptr; // 定义一个指向double类型的指针变量
*cptr=&dval; // 这个是错误的。你的原意是让cptr指向变量dval的地址,而指针前面的*为解引用运算符,即提取指针所指的内容。而等号的右边,在变量前面的&为取地址运算符,即把变量dval的地址取出来。你这样写当然就会产生编译错误,即不能把double *转换为 double类型”

(2)
double *cptr; // 定义一个指向double类型的指针变量
cptr=&dval; // 取出变量double型变量dval的地址,并赋予do