`
mzqthu
  • 浏览: 76054 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C语言字符串指针的用法体会

阅读更多

第一次发表博文,写得好不好请大家见谅。

这篇博文主要想讲一下最近遇到的有关字符串的问题。

我在练习指针的时候遇到这样一个问题,要求将一个字符串中间的某些部分删去,比如"abcdefghigk"删去中间几个字符以后变成"abcdigk",必须使用指针而不是数组。这看起来是一个很简单的问题,可是在写出代码以后却遇到一个问题,编译器通过了,但是运行却出现了0XC0000005的错误,说指针指向的位置写入时发生访问冲突。也就是无法进行修改。

然后在调试的过程中发现了问题所在行。简单点说,问题就是这句语句:*p = *q;

这句话看似没有错误,所以我就各种百度、google,查找有关字符串和指针的知识,最后终于得出了结果。下面就将结果展示给大家。

(1)字符串指针是一个指向常量的指针,也就是说,如果定义为char *p="ddddddd";那么*p就不能够进行赋值操作了。即再有一条*p = "d";那么就会产生以上的错误。

(2)为了避免这种错误,在定义和初始化的时候只能这样: char p[] = "ddddddd",这样定义的是一个字符数组,数组名p可以是一个指针,它指向字符串的第一个字符。这样就可以对字符串进行赋值或者其他改变值的操作了。

(3)这是为什么呢,原因在于,指向字符串的指针指向的是一个常量,常量是存储在静态内存区,而变量是存储在动态内存区。p[]是一个字符数组变量,存放字符串。而*p=“ddd”中的"ddd"是一个常量字符串,存放在静态内存区,故而不可以被修改。

 

然后,我还有一个问题,就是有时候在写程序时,并不知道所需要输入的字符串的大小,所以想是否可以利用指针,然后可以使:

char *p;

cin>>p;

这样来输入不限多的字符,显然这样做是不可以的。其实也不是显然,我试验了好多种方法都不行。最后得到的结果是:

(1)只能够定义一个大的数组,这样是一个比较浪费空间的方法。

char p[1000];

(2)还可以再输入前,先输入一个需要输入的大小,然后动态申请这么多的内存。

char p[];

int n;

cin>>n;

p=new char(n);

cin>>p;

(3)如果不这样做的话,还有一种比较麻烦的方法,就是使用链表,动态的进行。这样可以输入不限多字符。但显然会浪费很多效率。

 

第一次写。请大家多多指正,互相交流。

1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics