读书人

关于字符串指针动态分配内存和赋初值(

发布时间: 2012-03-04 11:13:34 作者: rapoo

关于字符串指针动态分配内存和赋初值(初学者求教)
我被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;
为什么这样子又不用申请空间就直接可以运行呢?

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





[解决办法]

C/C++ code
#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 char*p; 代表p指向的对象是 const char类型。所以指向的对象不可以被更改。

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

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

详见4楼链接的大神讲解。

读书人网 >C++

热点推荐