关于字符串指针动态分配内存和赋初值(初学者求教)

0zien0 2012-01-08 12:16:47
我被string,char,char*,char[],弄到思维乱七八糟了,望各位大大帮我整理下思维- -!


char a[] = "abc";//自动分配4个内存(包含'/0')的字符串数组;
char *cpa = a;//指向数组a的首地址
【问题1:cpa指针已经分配空间给他了?没有new空间给他哦?】
char *cpb = new char[100];//为cpb分配100个字符大小的空间
cpb = a; //把cpb指向数组a的首地址
【问题2:这种方法和上面的方法有什么区别啊?是不是这里分配了100个字符大小的空间给指针,但指针每次指向一个字符,所以是在浪费空间?】
cout<<cpb<<endl;//输出结果为abc
【问题3:我知道*cpb是输出当前指针所指向地址的值'a',但输出cpb指针的结果是整个字符串abc,cpb是一个字符指针,指向一个字符串,怎么会输出整个字符串而不是一个字符呢?难道系统自动做了遍历?】

char *cpc = "def";//cpc指针指向字符串首地址
【问题4:和问题1类似,这指针已经分配空间给他了?】

string b;
b = cpc;
【问题5:估计这个关于STL里面的string,用sring 定义了一个字符串常量b(而非指针)怎么可以把一个字符指针cpc赋值给字符串常量b的?】

【问题6: char *p = "abc" 对比 char e[] = "abc"; char *p = e;的区别】
个人猜想: 前者没为字符串申请空间,所以不能改动指针所指向的值,而后者所分配的空间则为4个字符大小的空间,所以只能删减字符而不能增加字符。

最后一个问题- -!!这就是实际操作中遇到的问题。
const char *a = 【调用一个函数,其返回值为("const char *x")】; //获取一段字符串
编译没错,但调试跟踪数据时,却说“错误的指针”,后来发现是因为指针a没有初始化和分配内存空间。
我随便写了个简单的相似的例子
const char *m = "poi";
const char *n = m;
cout<<n<<endl;
为什么这样子又不用申请空间就直接可以运行呢?

我思路很乱,问题很多,望各位热心人士帮忙解答



...全文
906 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2012-01-08
  • 打赏
  • 举报
回复
那只是指针指向某一个地址,并没有真正的为指针分配内存空间
hongwenjun 2012-01-08
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
char* cfun(char* str)
{
char* ret = str;
/* 函数功能实现
str是个指针,会在操作中改变地址,
所以增加个ret指针返回地址用*/
str++; // str 可以改变地址
return ret;
}
const char* cfun1(const char* str)
{
str = strstr(str, "world"); // str指针改变地址,但没有修改传入的字符
return str;
}
string& strfun(string& str)
{
/* 函数功能实现
str是引用的,不会改变地址
*/
// str++; // 错误: no 'operator++(int)'
return str;
}

int main()
{
char cstr[] = "Hello world!";
string str("Hello world!");

cout << cfun(cstr) << endl;
cout << cfun1("Hello world!") << endl;
cout << strfun(str) << endl;
return 0;
}

看代码,看贴图, 不修改,不能修改 就用 const
hongwenjun 2012-01-08
  • 打赏
  • 举报
回复
const char *m = "poi"; // 没有分配空间,指向了字符串常量
const char *n = m; // 没有分配空间,指向了字符串常量
cout<<n<<endl;
iamnobody 2012-01-08
  • 打赏
  • 举报
回复
iamnobody 2012-01-08
  • 打赏
  • 举报
回复
算了不说了,楼主看C++PRIMER吧,不要看哪些乱七八糟的书。否则像这种莫明奇妙的问题只会不断的冒出来。。
hongwenjun 2012-01-08
  • 打赏
  • 举报
回复
char *cpc = "def";//cpc指针指向字符串首地址
【问题4:和问题1类似,这指针已经分配空间给他了?】

应该写成
const char *cpc = "def"; //没有分配空间, cpc 指向了字符串常量
iamnobody 2012-01-08
  • 打赏
  • 举报
回复

char a[] = "abc";//自动分配4个内存(包含'/0')的字符串数组;
char *cpa = a;//指向数组a的首地址
【问题1:cpa指针已经分配空间给他了?没有new空间给他哦?】

答:指针一定要分配空间才能用吗?不是。难道是老谭的书这么说的吗?怎么这么多人有这个想法。
只要用有效的指针来初始化或者赋值给他后就可以访问。char*cpa = a;//这句的意思是用数组a的首元素的指针来初始化cpa;


yujie_v 2012-01-08
  • 打赏
  • 举报
回复
这个看看吧
游戏设计师 2012-01-08
  • 打赏
  • 举报
回复
不要纠结,看看汇编一切都会明朗的~
iamnobody 2012-01-08
  • 打赏
  • 举报
回复
new的作用是在堆内存中获得内存,并构造一个匿名的左值对象,并返回他的指针。

给指针赋值或初始化的不一定是new,可以是任何相应的类型的表达式。所以完全不存在分配内存一说。
iamnobody 2012-01-08
  • 打赏
  • 举报
回复
首先你要彻底忘掉要给指针分配空间这件事再看下面的内容。

指针作为一个普通的对象。他的内存管理和普通对象一模一样,不用额外的分配空间给他。
指针可以指向一个与指针类型相应的类型的对象,而他的值就是这个对象地址。

访问一个并不是指向一个有效对象的指针是不合法的。//通过赋值或初始化使指针指向一个有效的对象。

const char*p; 代表p指向的对象是 const char类型。所以指向的对象不可以被更改。

char* 类型可以转换成 const char*,反之不。

数组名可以转换成其首元素的指针:
const char *m = "poi";//“poi”是一个匿名的字符类型数组,可以转化成其首元素的指针。。

详见4楼链接的大神讲解。
0zien0 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mingliang1212 的回复:]
char a[] = "abc";//自动分配4个内存(包含'/0')的字符串数组;
char *cpa = a;//指向数组a的首地址
【问题1:cpa指针已经分配空间给他了?没有new空间给他哦?】

答:指针一定要分配空间才能用吗?不是。难道是老谭的书这么说的吗?怎么这么多人有这个想法。
只要用有效的指针来初始化或者赋值给他后就可以访问。char*cpa = a;//这句的意思是用……
[/Quote]

又有新的理解- -! char *cpa = a; 也有分配空间的,只是常量不能修改而已。
const char *a = 【调用一个函数,其返回值为("const char *x")】;
至于最后的问题也知道原因了,因为作为赋值的是一个函数的返回值,该返回值在完成操作后就会释放掉他的内存空间,那么如果不初始化指针a的话,那么a将会指向一个被释放掉的控制,所以会发生指针出错的问题。
0zien0 2012-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mingliang1212 的回复:]
char a[] = "abc";//自动分配4个内存(包含'/0')的字符串数组;
char *cpa = a;//指向数组a的首地址
【问题1:cpa指针已经分配空间给他了?没有new空间给他哦?】

答:指针一定要分配空间才能用吗?不是。难道是老谭的书这么说的吗?怎么这么多人有这个想法。
只要用有效的指针来初始化或者赋值给他后就可以访问。char*cpa = a;//这句的意思是用……
[/Quote]

看来上面的大神们的解答,主要原因在于,定义指针不一定要为其分配空间,但这样的指针不能修改其值,所以最好在指针前加上“const”。
这样说对吧???
那么什么时候才需要对指针new一个内存空间,函数指针的运用时???


还有,各位大神能回答一下最后一个问题么?

const char *a = 【调用一个函数,其返回值为("const char *x")】; //获取一段字符串
编译没错,但调试跟踪数据时,却说“错误的指针”,后来发现是因为指针a没有初始化和分配内存空间。
为什么要初始化和分配内存空间

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧