char str[]与char *str的区别

转载自 http://blog.csdn.net/wangluotong00/article/details/39367709

今天做题的时候遇到一个问题,如何实现一个函数返回一个指针,返回一个整型值很简单,因为“C语言是按值传递的”,而想要返回一个指针,比如char型的指针,然后想在主调函数中使用被调函数的返回指针,分析了一下关于char str[]和char *str的区别

下面介绍一下char str[]="hello"与char *str="hello"的区别

char str[]="hello";

第一个表达式表示的是在动态变量区中开辟一个能连续放6个字符的数组,数组名称是str.而赋值运算符右边是一个字符串常量,这个字符串常量是存放在常量区的,这个表达式的意思就是将“hello”这个字符串常量拷贝到刚才开辟的数组中。C语言规定,表达式如果是一个数组名,则代表的意思是该数组的起始地址,如果这个数组在一个函数中定义,如果以数组名返回时,因为数组在函数中定义,是个局部变量,函数返回之后,这个数组所占用的空间就被释放掉了,数组也被破坏掉了,因此返回的数组名也就没有意义,不能被其主调函数使用了。

如果我们这样写:

char *foo()

{

char str[]="hello";

return str;

}

在编译的时候就会出现警告:函数返回局部变量的地址

再来看下char *str="hello"

这个表达式的意思是在动态变量区中开辟一个存放指针的存储单元,指针变量名是str,"hello"同样也是一个字符串常量,存储在常量区,在程序的运行过程中一直存在。把字符串“hello”的地址值拷贝到刚才的存储单元中,即指针变量str的初值是字符串“hello”的地址。这时如果char *str="hello"定义在一个函数中并且以return str返回,因为str是一个变量名,返回的仅仅是str的值,所以在其他函数中可以使用该值,照样能够访问到“hello”这个字符串,例如:


结果为:


再看下面一个例子:


在这个foo函数中,str是一个数组名,单独的数组名表示这个数组的起始地址,现在把这个地址赋值给另外一个指针变量p,最后返回p。编译没有错误,执行出现乱码,因为在函数foo中返回的是数组str的起始地址,而不是字符串常量“hello”的起始地址,所以函数foo返回之后,这个地址也就没有意义了,是一个无效地址,在主调函数中也就不能使用了,从而不能打印出“hello”这个字符串了。

  • 18
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值