char *p=new char

char *p=new char问题:
按理 return p应该返回一个字符,可是我这return p 依然是返回一个字符串, 那么说开辟一个字符空间与开辟一个字符串空间的方法是通用的?

--------------------------------------------------------------------------------
是通用的,指针这个东西很灵活,在C++的类中 也用来描述多态性。return P要看P的指向是什么了,P指向一个字符,他就返回一个字符,P指向一个字符串,他就返回一个字符串。比如说一个char类型数组名的就能看成一个指针(存储的是地址,但不是变量,不能对他赋值),测试“cout<<数组名”可以输出这个数组。

2.char * p = new char;相当于定义了一个字符指针,并且给这个字符指针指向动态分配了的1字节内存,这时你可以给*p='a'这样的赋值。这可和char* p;是不同的,因为如果只是char * p;的话,只是定义了一个字符指针,而这个指针指向的内存单元地址是NULL,如果这时 
你再*p='a';就会出错,因为系统无法将字符'a'放入一个内存为NULL的地址空间中。 
当然,像你说的p=str1;当然没有错。因为两者都是指针,对应的物理原形都是32个bit,当然可以赋值成功的。呵呵


3.可以,这样是说明指针P指向一个char类型的不是char类型的数组。 
首先编译的时候只是检查类型匹配。 
首先 char *p = new char , 
而char *str1=new char[n]。 
这两个指针类型是相同的,自己体会一下 
还有一个问题, 
char *p = new char 是初始化, 
char *p; p = new char 是赋值操作。
 
两者是截然不同的,初始化的效率比赋值操作要高。举个例子,比如说你参军。初始化就是你参军的时候发军服给你。赋值就是你参军的时候先随便给你一件衣服,等某天再给你一件军服。大概就是这个意思,我也是自己体会出来的,C++学久了,就明白了.

 

可是p只是指向一个字符, 如果return p应该只返回一个字符
可是我这return p依然返回的是一个字符串,这是为什么呢?

--------------------------------------------------------------------------------
呵呵,对不起呀。我刚才出去办事了。
你说的我明白,让我慢慢给你解释。首先你char* p = new char;是定义了一个字符指针,new char分配了一个bit的空间,并让p指向这个空间。
而我们在定义一个C语言传统字符串时常用char* str= "ABCDE";是因为"ABCDE"常量代表的是存放这组字符串的首地址,然后把这个地址赋给了str。
OK,讲到这里,我给你一个例子
1    #include <iostream> 
2    using namespace std;
3    void main()
4    {
5     char* a= new char;
6     a = "abcde";
7     cout<<a<<endl;
8    }
结果是:abcde.
知道为什么吗?因为a只是个指针而以,它可以指向一个字符,也可以指向一个字符串。在第5行的时候,a指向的是一个一字节的char,但是在第6行的时候,a已经指向"abcde"了。所以输出的时候,就是"abcde"了。所以这个例子是一个典行的资源泄露的例子因为new char了,确没有使用,并由于a在之后已经不指向这个字符的空间,使之以后都没有机会再被释放掉了,所以这1bit空间就资源泄露了
好了,如果你还有什么问题,可以再给我消息。一起学习!

文章出处:http://blog.csdn.net/zherowolf/article/details/5944849

后面附上我在写程序时遇到的问题:

CFile fp;
if(!fp.Open(lpszPathName, CFile::modeRead|CFile::typeBinary/*|CFile::typeText*/)) //默认二进制读//
{
AfxMessageBox("open file failure!");
return;
}

char* fpchar = new char[fpLen];  //初始化的效率高于赋值// 刚开始写成了new char(fpLen);后来改成了new char[fpLen];

memset(fpchar, 0, fpLen);

fp.Read(fpchar, fpLen);

ULONGLONG pos = fp.GetPosition(); //调用CFile的GetPosition函数就可以知道当前在哪个位置了.

delete []fpchar;

读文件是有个文件指针,调用Read时文件指针制动向前移动,下次再调用是是接着上次文件指针读。

附上网上看到的一个实例:

成员变量char * point;
在构造函数中point = new char[10];  point="hello";
在析构函数中delete[] point;
运行的时候出现错误  这是为什么  如果把point="hello";删了就不报错了
代码如下 :
#include<iostream>
using namespace std;

class C
{
 char* point;
public :
 C()
 {
  point = new char[5];
  point = "fda";//这句话注销了就对了 不知道为什么
 }
 ~C()
 {
  delete[] point;
 }

};
main()
{
 C c;
}
不知道为什么会报错

point = new char[5];时 point指向了一新分配的内存
point = "fda";时,point抛弃了刚new的内存,指向了"fda"所在地址。“fda"本身已经被分配好内存。所以刚才的new内存已经失去意义,因为point已经不再指向它了。这也是造成内存泄露的一个原因,因为刚动态分配的那块内存已经没办法释放了(被point指针抛弃了,没办法再找到这块内存地址,也就没法delete)。
"fda"的内存不是动态分配的,所以delete时出错。
----------------------------------------------------------------------
这要一个一个字符来操作:point[0] = 'f'; point[1] = 'd'; point[2] = 'a'; 或者参考 jxq61 兄的回答。(注意,这里才是真正的把字符存到新分配的内存里)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值