C++指针问题

int *p=new int;
*p=3000;
delete p;
p=0;
int i;
p=&i;
请问为什么给指针p赋值为3000的时候要加星号 ,而把指针赋为0却不加星号,还有用指针保存其它变量的地址也不用加星号. 越详细越好 答得好的加分.

首先回答你第一个问题
一般指针通过取地址的方式去获得了一个数据空间的地址char *p = &s;(假设s是一个数组);动态指针的初始化char *p = malloc(10*sizeof(char))或者char *p = new(10*sizeof(char)),那么这个p指向的数组存放的数据就不是连续的了,就是说p指向了不连续的空间,而静态分配(一般的指针),你很明显的看到它取址了一个数组首地址,这个数组中存放的值必然是连续的,就是说p指向了一块连续的空间;
其次回答你第二个问题:刚才提到malloc和new 两种动态建立的方法。两者有什么区别呢?new一般是限于C++使用的(C中不常用),new一般用于开辟堆空间,malloc可以开辟堆也能开辟栈。
区别之一:new开辟的空间,会调用空间的构造函数,被new的空间会被初始化一定的数值
malloc 开辟的空间只是告诉你这块区域能存放某一种类型的数据但是这个时候具体数据并没有存放,要后期赋值。
区别之二:malloc 开辟的空间在函数结束的时候,会被自动free(p);p = NULL;并且那块空间也不被释放了,(简而言之,在哪个函数开辟,就在哪个函数结束时候被释放,但是new 则需要调用相应的析构函数才能被释放,i必须使用delete 去手动释放,假设你不手动释放,对不起,你内存泄露了,这个空间数据一致存放在那,但是你的指针p被free了,所以你找不到那块地址了,也就是不可见了。这个程序每执行一次,你2G的内存就会少一块空间,显然你不愿意,那么记得要释放哦。。。谢谢
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-09-25
*p是给对应指针数组赋值,表示该数组的第一个元素的值,所以加星号;后面的p=0其实是为了杜绝野指针,将指针置空(你可以看成NULL);最后一个是指指针p取i的地址,你也可以写成*p=&i的,不信你可以在编译工具里试试。指针式C的精华所在,建议你回头再看看C语言的指针那章,希望能帮到你。
第2个回答  2011-09-25
为什么给指针p赋值为3000的时候要加星号:
不是给指针变量p赋值,是给 p所指向的地址赋值 3000
而把指针赋为0却不加星号
这是将 指针p 清空为0,这里就是给p赋值了

变量p保存的是地址而非数据。
& 是 取地址运算符,* 是 间接访问运算符。追问

你的意思是说当创建一个new空间,这个new空间就已经有一个内存地址了是吗?
而指针指向的是这个new空间的地址?*p=3000是吧3000的内存地址放到这个new空间.
用delete是清空这个new空间的地址,p=0是清空指针的地址?
上面有位朋友说*p=&i和p=&i是一样的,但是我用vc运行提示错误.
这里要怎么去理解!

追答

delet 的作用是 释放指针所指向的空间,使这段空间又可以被其他变量使用。
如果delet后不把p设为0,指针p还是可以调用的(非法操作) ,不过系统会将这块空间继续分配给其他程序或变量使用,其结果可想而知。

上面有位朋友说*p=&i和p=&i是一样的,但是我用vc运行提示错误.
*p=&i和p=&i 是不一样的。提示错误是因为 你已经把p清空为0 了,也就是指针p没有指向某个地址,*p=&i 当然就报错了

释放了p再调用p还是可以的,但如图 我调试的时候就有问题。

建议仔细看看指针的章节。

无语。。。。

第3个回答  2011-09-25
非也非夜,回答追问 没反应,。。
delete 是释放指针所指向的空间,使这段空间又可以被其他变量使用。
p=0 是将指针p清空。
在delete后不将指针p设为NULL(0)的话,p还是可以调用的,但是系统还会将这块空间分配给其他变量或程序,其结果可想而知。
“上面有位朋友说*p=&i和p=&i是一样的,但是我用vc运行提示错误.”
*p=&i和p=&i是不一样的。 提示错误是因为 你已经把p清空为0 了,也就是指针p没有指向某个地址,*p=&i 当然就报错了。
第4个回答  2011-09-25
指针是指地址,首先int *p=new int;是分配一个int的空间,而p是这个空间的地址,其中*表示是指针变量。
*p=3000;表示将指针p所表示的地址指向的空间赋值为3000,不是给指针赋值,是给指针指向的内容赋值。
p=&i;则是给指针赋值,指针的值是变量i的地址。追问

我在非也非夜那位朋友那提交了追问,能帮忙看下我理解的对不对吗?

追答

其他都是对的,只有“而指针指向的是这个new空间的地址?*p=3000是吧3000的内存地址放到这个new空间”这个不对,*p=3000;表示将指针p所表示的地址指向的空间赋值为3000。不是把3000的内存地址放到这个new空间。
上面有位朋友说*p=&i和p=&i是一样的,但是我用vc运行提示错误.
--这个是不对的,p=&i是给指针赋值,*p=&i应该是报错的吧?

本回答被提问者采纳
相似回答
大家正在搜