字符数组与字符指针

关于这个问题,源于一道题目:

char * get_str()
{
      char str[]="abcdefg";
      return str;
}

问这个函数中存在什么问题,编程方面我对于字符串用的很少,基础又比较薄弱,因此第一眼看上去感觉很对。但是经过对于字符数组和字符指针的学习,才发现自己陷入了一个误区。下面总结一下字符数组和字符指针的区别:

char* pstr="abcde";

char str[]="abcde";

这两者主要的区别在于初始化之后字符串的存储位置不同,char* 指针本身是局部变量,因此存储在内存中的栈上,但是指针所指向的字符串是常量,存储在只读数据段(和全局、静态存储区有区别),因此,所有试图去修改字符串的操作都会出现问题,比如:strcpy(pstr,“abclkj”);正确的使用strcpy的方法是:

char *ret;
ret=(char *)malloc((strlen(pstr)+1)*sizeof(char));
strcpy(ret,pstr);

则在程序中,可以使用如下语句:

pstr++; /* 指针pstr1 */

pstr = "This is a NEW string."; /* 使指针指向新的字符串常量 */

pstr = str1; /* 改变指针pstr的指向 */

strcpy( str, "This is a NEW string.") /* 改变字符串的的内容 */

strcat( str, pstr) /* 进行串连接操作 */

在程序中,不能进行如下操作:

str++; /* 不能对数组名进行++运算 */

str = "This is a NEW string."; /* 错误的串操作 */

str = str1; /* 对数组名不能进行赋值 */

strcat(pstr, "This is a NEW string.") /* 不能在str的后面进行串连接 */

strcpy(pstr, str) /* 不能向str进行串复制 */


因此,给定一个字符串“abc”,是否是常量要取决于把字符串赋给一个字符串数组还是字符串指针;

对于字符指针指向的字符串,因为是常量,因此,无论通过pstr[i]=‘H’或*pstr=‘H’都不可以改变字符串中的字符。

而字符数组,既可以通过下表访问也可以通过指针来修改字符串中的字符。


因此,文章开头的题目就可以改成:

char * get_str()
{
      char *str="abcdefg";
      return str;
}

或者将字符数组声明为static。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值