这堆栈, 字符串数组与字符串指针
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;
}
原来堆栈基本不太懂,现在稍稍知道了,还有字符串指针和数组的区别。哎
简单的写了几个定义和初始化字符串的方式
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;
}
相关文章推荐
- 三十二、数组、指针和字符串:string类
- 字符串 指针 数组
- 涉及到指针、数组、堆栈、以及printf
- IOS开发---C语言-⑫指针与数组、字符串
- 指针和字符串,数组和字符串(1)
- 指针数组和字符类型的二维数组在处理字符串时的区别
- C++指针、数组、字符串结论杂记
- 【牛客 题库】 指针移动 || 类创建对象的个数|| 求字符串数组中长度最短的字符串所在的行下标
- 一道二级C题引发的思考-- c++函数传递指针的本质 与 字符串指针与字符数组的区别
- 深入理解字符串指针和字符串数组
- c语言基础2—数组、字符串、指针
- 字符数组与指向字符串的指针的区别
- 字符串指针与字符数组的区别
- 主题四 指针和数组(上)----23.C语言中的字符串
- 字符串、字符数组、字符指针
- 修改字符串字面量&用数组/指针实现的字符串。
- C++复习5.指针数组字符串
- 数组名和字符串指针的那些事
- 二十六、数组、指针和字符串:数组的存储与初始化、对象数组、数组作为函数参数
- 二十七、数组、指针和字符串:指针变量的声明、地址相关运算