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 兄的回答。(注意,这里才是真正的把字符存到新分配的内存里)