您的位置:首页 > 其它

这堆栈, 字符串数组与字符串指针

2008-07-18 16:16 225 查看
今天还在做着小作业,终于把框架大体搭好,准备脱离stl用c语言来解析字符串。却碰到了诸多问题。

原来堆栈基本不太懂,现在稍稍知道了,还有字符串指针和数组的区别。哎

简单的写了几个定义和初始化字符串的方式

char *szName1 = " dir \ad\ what are you doing"; // q全局const区域

char szName2[] = " dir \ad\ what are you doing";//栈 区

char *szName3 = new char[64]; //堆区

szName3 = " dir \ad\what are you doing";

char *szName4 = szName2; //栈区的指针指向栈区的内存

debug一看,原来果真只有 szName[2]是char[]型

debug信息:

- szName1 0x0041564c " dir dWhat are you doing" char *

32 ' ' char

- szName3 0x0041564c " dir dWhat are you doing" char *

32 ' ' char

- szName4 0x0012ff38 " dir dWhat are you doing" char *

32 ' ' char

- szName2 0x0012ff38 " dir dWhat are you doing" char [27]

[0] 32 ' ' char

[1] 32 ' ' char

[2] 100 'd' char

......

我理解是:

指针保存的仅仅是这个串的首地址,而串数组保存了整个串的信息,数组名可以用来访问首地址,但并不是一个指针!

我写了一个函数是要传递指针的指针,当我把szName1, szName3, szName4取地址传过去可以,但是传递&szName2就不行了,提示错误是不能实现数组的指针向指针的指针 转换。

我曾经试图传递指针的引用来实现修改字符串指针的功能,szName1, szName3, szName4也可以实现引用的传递,而szName2 还是不行。其实我想得到一个官方的解释,暂时就先这样理解了。

char amessage[] = "now is the time"; /* an array */

实际上等同于

char amessage[16] ;

strcpy(amessage, "now is the time" ;

16是字符串"now is the time"的长度加1.

可以看出内存空间是分配在栈上的.

char *pmessage = "now is the time"; /* a pointer */

而pmessage指向的内容始终是常量,不可能被改变的.

而p = strdup(a)实际上等同于

p = (char*)malloc(strlen(a) + 1) ;

strcpy(p, a) ;

可以看出来,strdup返回的指针指向的是在堆上新分配的内存.

要修改也是修改新分配的内存空间中的内容.不是原来a指向的内容.

程序代码:

#include "stdio.h"

#include "string.h"

const int MAX_LENGTH = 256;

void StrReStrEx(char **pnewstr, char c)

{

size_t i = 0;

for (; i<strlen(*pnewstr); i++)

{

if ((*pnewstr)[i] != c)

{

break;

}

}

*pnewstr = *pnewstr+i;

}

void StrReStrEx1(char *&newstr, char c)

{

size_t i = 0;

for (; i<strlen(newstr); i++)

{

if ((newstr)[i] != c)

{

break;

}

}

newstr = newstr+i;

}

int main()

{

char *szName = " dir \ad\What are you doing"; // q全局const区域

char szName2[] = " dir \ad\What are you doing";//栈 区

char *szName3 = new char[MAX_LENGTH]; //堆区

szName3 = " dir \ad\What are you doing";

char *szName4 = szName2; //栈区的指针指向栈区的内存

printf("%s\nszName:%d\n",szName, strlen(szName));

char *temp = szName;

StrReStrEx1(szName, ' ');

printf("%s\nszName1:%d\n",szName, strlen(szName));

StrReStrEx1(szName3, ' ');

printf("%s\nszName3:%d\n",szName3, strlen(szName3));

StrReStrEx1(szName4, ' ');

printf("%s\nszName4:%d\n",szName4, strlen(szName4));

// StrReStrEx1(szName2, ' ');

// printf("%s\nszName:%d\n",szName2, strlen(szName2));

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: